只有当值为true时,返回对象键

36

如果对象中某个键的值为 true,我该如何仅返回该键名?

我正在使用 underscore,但我只看到了如何返回键名,这很容易实现。尽可能避免冗余的迭代是我的目标:

例如:

Object {1001: true, 1002: false} 

我想要一个只有1001的数组...

5个回答

59

Object.keys 可以获取对象的键,然后您可以根据值进行筛选

var obj = {1001: true, 1002: false};

var keys = Object.keys(obj);

var filtered = keys.filter(function(key) {
    return obj[key]
});

FIDDLE


23
简化版翻译:keys = Object.keys(obj).filter(k => obj[k])通俗易懂版翻译:将对象中值为真的键名过滤出来,存入一个数组中。 - vsync

16

还有另一种选择,可以使用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"]

我希望那会有所帮助


5

如果你想要在对象上同时进行过滤和迭代操作,通常会使用 _.reduce(瑞士军刀式的迭代器):

var trues = _(obj).reduce(function(trues, v, k) {
    if(v === true)
        trues.push(k);
    return trues;
}, [ ]);

演示: http://jsfiddle.net/ambiguous/2et6T/

3

如果你有一个对象,其中的属性与布尔类型不同,你可能想要使用过滤器将它们删除:

@vsync remixed

const obj = {1001: true, 1002: false, 1003: "foo"};
keys = Object.keys(obj).filter(k => obj[k] === true);

//keys = ["1001"];

2
obj = {one: false, two: true, three: false, four: true}    
var values = Object.keys(obj).filter(key => obj[key])
console.log(values)

1
你应该在这里添加一个描述,而不仅是贴上一些代码。解释为什么这个方案可以解决问题。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接