如果对象中某个键的值为 true,我该如何仅返回该键名?
我正在使用 underscore,但我只看到了如何返回键名,这很容易实现。尽可能避免冗余的迭代是我的目标:
例如:
Object {1001: true, 1002: false}
我想要一个只有1001的数组...
如果对象中某个键的值为 true,我该如何仅返回该键名?
我正在使用 underscore,但我只看到了如何返回键名,这很容易实现。尽可能避免冗余的迭代是我的目标:
例如:
Object {1001: true, 1002: false}
我想要一个只有1001的数组...
Object.keys 可以获取对象的键,然后您可以根据值进行筛选。
var obj = {1001: true, 1002: false};
var keys = Object.keys(obj);
var filtered = keys.filter(function(key) {
return obj[key]
});
还有另一种选择,可以使用Lodash库的两种方法:
_.pickBy
- 创建一个由对象属性组成的对象。如果没有其他参数(谓词),则所有返回的属性都将具有truthy值。_.keys(object)
- 从给定对象创建一个键数组所以在你的例子中,它应该是这样的:
var obj = {1001: true, 1002: false};
var keys = _.keys(_.pickBy(obj));
// keys variable is ["1001"]
使用 Underscore.js 库,非常类似。你需要使用 _.pick
和 _.keys
函数。唯一的区别在于 _.pick
需要一个谓词函数,该函数是 _.identity
。
因此代码如下:
var obj = {1001: true, 1002: false};
var keys = _.keys(_.pick(obj, _.identity));
// keys variable is ["1001"]
我希望那会有所帮助
如果你想要在对象上同时进行过滤和迭代操作,通常会使用 _.reduce
(瑞士军刀式的迭代器):
var trues = _(obj).reduce(function(trues, v, k) {
if(v === true)
trues.push(k);
return trues;
}, [ ]);
如果你有一个对象,其中的属性与布尔类型不同,你可能想要使用过滤器将它们删除:
@vsync remixed
const obj = {1001: true, 1002: false, 1003: "foo"};
keys = Object.keys(obj).filter(k => obj[k] === true);
//keys = ["1001"];
obj = {one: false, two: true, three: false, four: true}
var values = Object.keys(obj).filter(key => obj[key])
console.log(values)
keys = Object.keys(obj).filter(k => obj[k])
通俗易懂版翻译:将对象中值为真的键名过滤出来,存入一个数组中。 - vsync