我想过滤一个特定的对象属性。如果该属性为false或undefined/null,我希望它包含在内。在下面的例子中,我通过deliciousRating进行总结,只要isBruised不成立。但是,我不知道如何包含undefined/null值。
var apples = [
{isBruised: true, deliciousRating: 1},
{isBruised: false, deliciousRating: 10},
{deliciousRating: 9}
];
_.sumBy(_.filter(apples, ['isBruised', false]), 'deliciousRating');
我希望这个能返回19,但目前它只得到苹果的美味评级[1]。
使用_.reject()
而不是_.filter()
。_.reject()
方法是…
与_.filter相反;该方法返回的元素谓词不返回truthy for的集合。
var apples = [
{isBruised: true, deliciousRating: 1},
{isBruised: false, deliciousRating: 10},
{deliciousRating: 9}
];
var result = _.sumBy(_.reject(apples, 'isBruised'), 'deliciousRating');
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
在vanillaJS中,您可以使用Array#reduce来对未受损的项目求和:
var apples = [
{isBruised: true, deliciousRating: 1},
{isBruised: false, deliciousRating: 10},
{deliciousRating: 9}
];
var result = apples.reduce(function(s, o) {
return o.isBruised ? s : s + o.deliciousRating;
}, 0);
console.log(result);
我将使用本机过滤函数.filter((v) => !v.isBruised)
。如果isBruised
是null
、undefined
、false
或不存在,则将包括deliciousRating
密钥。
const apples = [
{isBruised: true, deliciousRating: 1},
{isBruised: false, deliciousRating: 10},
{deliciousRating: 9}
];
const r = _.sumBy(apples.filter((v) => !v.isBruised), 'deliciousRating');
console.log(r);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>