duc*_*cin 27 javascript underscore.js
案例很简单 - 我有一个以下对象:
Object {1: false, 2: true, 3: false, 4: false, 5: false, 6: false, 7: false, 8: true, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false}
Run Code Online (Sandbox Code Playgroud)
我需要使用下划线来获得具有真正价值的ID数组.在上述情况下,将是:
[2, 8]
Run Code Online (Sandbox Code Playgroud)
我尝试了一些东西,但我有点卡住了.有谁有想法吗?
gus*_*nke 43
var keys = [];
_.each( obj, function( val, key ) {
if ( val ) {
keys.push(key);
}
});
Run Code Online (Sandbox Code Playgroud)
使用普通的下划线可能有更简单/更短的方式.
如果这里的任何人使用Lodash而不是Underscore,以下也是可能的,这是非常简短和易于阅读:
var keys = _.invert(obj, true)[ "true" ];
Run Code Online (Sandbox Code Playgroud)
Giorgi Kandelaki给出了一个很好的答案,但它有一些潜在的问题(请参阅我对他的回答的评论).
正确的方法是:
_(obj).pairs().filter(_.last).map(_.first)
Run Code Online (Sandbox Code Playgroud)
要么
_.map(_.filter(_.pairs(obj),_.last),_.first)
Run Code Online (Sandbox Code Playgroud)
var data = {1: false, 2: true, 3: false, 4: true};
var filteredIds = _.filter(_.keys(data), function (key) {
return data[key];
});
// result [2, 4]
var rejectedIds = _.reject(_.keys(data), function (key) {
return data[key];
});
// result [1, 3]
Run Code Online (Sandbox Code Playgroud)
你可以用_.pick.像这样:
var data = {1: false, 2: true, 3: false, 4: false, 5: false, 6: false, 7: false, 8: true, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false}
var keys = _.keys(_.pick(data, function(value) {
return value;
}));
Run Code Online (Sandbox Code Playgroud)