使用lodash查找具有truthy值的JS对象的属性

时间:2015-04-03 23:44:43

标签: javascript lodash

假设我有一个像这样的对象:

var foo = {
    alpha: true,
    beta: false,
    gamma: true
}

我可以使用_.findKey来获取一个具有true值的键,但我真的想要一个包含所有具有true值的键的数组。 E.g。

_.findAllKeys(foo, function(val) { return val; });
// yields -> ["alpha", "gamma"]

写一个函数来做这个很简单,但看起来像findKey的这种明显的概括,我觉得我必须要错过它。 lodash有这样的功能吗?

6 个答案:

答案 0 :(得分:19)

var foo = {
    alpha: true,
    beta: false,
    gamma: true
};

var t1 = _.keys(_.pick(foo, _.identity));
console.log(t1);

var t2 = _(foo).pick(_.identity).keys().value();
console.log(t2);
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

修改
正如@backdesk所指出的那样,_.pick不再适用于lodash 4,因为_.pickBy被拆分了。

var foo = {
    alpha: true,
    beta: false,
    gamma: true
};

var t1 = _.keys(_.pickBy(foo, _.identity));
console.log(t1);

var t2 = _(foo).pickBy(_.identity).keys().value();
console.log(t2);

// _.pickBy defaults to _.identity

var t3 = _.keys(_.pickBy(foo));
console.log(t3);

var t4 = _(foo).pickBy().keys().value();
console.log(t4);
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.8.2/lodash.min.js"></script>
<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

答案 1 :(得分:7)

我找到了一个同时感觉邋and和优雅的答案。

var foo = {
    alpha: true,
    beta: false,
    gamma: true
};
_.invert(foo, true).true

// yields -> ["alpha", "gamma"]

答案 2 :(得分:3)

默认情况下,loDash中的

pickBy使用_.identity来过滤属性 所以你可以像这样使用它:

_.pickBy({'a': undefined, 'b':1, c:{}});

// => Object {b: 1, c: Object}

答案 3 :(得分:1)

我认为您正在寻找pick方法。

  

返回对象的副本,过滤为仅具有列入白名单的键(或有效键数组)的值。或者,接受一个谓词,指示要选择的键。

&#13;
&#13;
var foo = {
    alpha: true,
    beta: false,
    gamma: true
};

var picked = _.pick(foo, function(value) { return value; });
console.log(picked);

$('#output').html(JSON.stringify(picked));
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.js"></script>
<div id="output">
</div>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

我个人更喜欢以下内容 - 即使它更加冗长 - 因为我认为它的作用更为明显。但它需要es6语法:

_.toPairs(foo)
  .filter([key, value] => value)
  .map([key, value] => key);

如果您的ESLint不允许使用未使用的变量,您可以在.eslint.yml中使用以下内容:

rules:    
  no-unused-vars:
    - 2
    - vars: all
      args: after-used
      argsIgnorePattern: _$

允许写

_.toPairs(foo)
  .filter([key_, value] => value)
  .map([key, value_] => key);

答案 5 :(得分:0)

试试

var foo = {
    alpha: true,
    beta: false,
    gamma: true
}

_。pickBy(foo,_.identity);