【发布时间】:2017-02-20 22:12:17
【问题描述】:
我有一个只包含简单键值对的对象,我想过滤掉任何具有虚假值的属性。这可以使用 Array.prototype.filter() 吗?
【问题讨论】:
-
请阅读How to Ask。关键词:“搜索和研究”和“解释......任何阻碍你自己解决的困难”。
标签: javascript functional-programming
我有一个只包含简单键值对的对象,我想过滤掉任何具有虚假值的属性。这可以使用 Array.prototype.filter() 吗?
【问题讨论】:
标签: javascript functional-programming
这可以使用 Array.prototype.filter() 吗?
可以,但不能直接使用:您可以在使用 Object.keys 或类似名称后进行:
var arrayOfTruthyValues = Object.keys(obj).filter(key => obj[key]);
结果是一组真值。
如果您希望最终结果是一个对象,将filter 与reduce 结合即可:
var newObj = Object.keys(obj)
.filter(key => obj[key])
.reduce((newObj, key) => {
newObj[key] = obj[key];
return newObj;
}, {});
这主要是使用reduce 作为循环构造(因为我们从未真正更改累加器值,我们只是不断返回相同的对象),这有时被认为是“滥用”。 :-) 这意味着我们可以不使用filter 部分,只需在reduce 中添加一个if,但是...
请注意,Object.keys 仅包含对象的自己的、可枚举 属性。如果您想要拥有自己的属性,即使它们不可枚举,那也可能是 Object.getOwnPropertyNames。
【讨论】: