使用 lodash 查找具有真值的 JS 对象的属性
Find properties of JS object with truthy values using lodash
假设我有一个像这样的对象:
var foo = {
alpha: true,
beta: false,
gamma: true
}
我可以使用 _.findKey 来获得一个具有真值的键,但我真的很想获得一个包含所有具有真值的键的数组。例如
_.findAllKeys(foo, function(val) { return val; });
// yields -> ["alpha", "gamma"]
编写一个函数来执行此操作非常简单,但它似乎是 findKey 的明显概括,我觉得我一定是错过了它。 lodash有这样的功能吗?
我找到了一个既笨拙又优雅的答案。
var foo = {
alpha: true,
beta: false,
gamma: true
};
_.invert(foo, true).true
// yields -> ["alpha", "gamma"]
我认为您正在寻找 pick
方法。
Return a copy of the object, filtered to only have values for the whitelisted keys (or array of valid keys). Alternatively accepts a predicate indicating which keys to pick.
var foo = {
alpha: true,
beta: false,
gamma: true
};
var picked = _.pick(foo, function(value) { return value; });
console.log(picked);
$('#output').html(JSON.stringify(picked));
<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>
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>
loDash 中的 pickBy 默认使用 _.identity
来过滤属性
所以你可以这样使用它:
_.pickBy({'a': undefined, 'b':1, c:{}});
// => Object {b: 1, c: Object}
我个人更喜欢以下内容 - 尽管它更冗长 - 因为我认为它的作用更明显。不过它需要 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);
试试
var foo = {
alpha: true,
beta: false,
gamma: true
}
_.pickBy(foo, _.identity);
我们可以在 lodash 中使用 pickBy() 来获取值为 true 的键。
const active = _.keys(_.pickBy(foo));
或者我们也可以使用,
var active = _.keys(foo).filter(function (id) {
return foo[id]
});
假设我有一个像这样的对象:
var foo = {
alpha: true,
beta: false,
gamma: true
}
我可以使用 _.findKey 来获得一个具有真值的键,但我真的很想获得一个包含所有具有真值的键的数组。例如
_.findAllKeys(foo, function(val) { return val; });
// yields -> ["alpha", "gamma"]
编写一个函数来执行此操作非常简单,但它似乎是 findKey 的明显概括,我觉得我一定是错过了它。 lodash有这样的功能吗?
我找到了一个既笨拙又优雅的答案。
var foo = {
alpha: true,
beta: false,
gamma: true
};
_.invert(foo, true).true
// yields -> ["alpha", "gamma"]
我认为您正在寻找 pick
方法。
Return a copy of the object, filtered to only have values for the whitelisted keys (or array of valid keys). Alternatively accepts a predicate indicating which keys to pick.
var foo = {
alpha: true,
beta: false,
gamma: true
};
var picked = _.pick(foo, function(value) { return value; });
console.log(picked);
$('#output').html(JSON.stringify(picked));
<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>
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>
pickBy 默认使用 _.identity
来过滤属性
所以你可以这样使用它:
_.pickBy({'a': undefined, 'b':1, c:{}});
// => Object {b: 1, c: Object}
我个人更喜欢以下内容 - 尽管它更冗长 - 因为我认为它的作用更明显。不过它需要 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);
试试
var foo = {
alpha: true,
beta: false,
gamma: true
}
_.pickBy(foo, _.identity);
我们可以在 lodash 中使用 pickBy() 来获取值为 true 的键。
const active = _.keys(_.pickBy(foo));
或者我们也可以使用,
var active = _.keys(foo).filter(function (id) {
return foo[id]
});