removeZero({ a: 0, b: 1, c: -1 })
output:
removeZero({ b: 1, c: -1 })
我正在尝试使用函数式编程方法编写一个函数,它仅使用 map()
、reduce()
、filter()
。这是我最好的方法,但没有奏效。
const removeZero = (item) => (
Object
.keys(item)
.filter(Boolean)
.map((key) => ({ [key]: item[key] }))
.reduce((acc, curr) => ({ ...acc, ...curr }))
)
知道如何解决这个问题吗?
最佳答案
你很接近。这行得通并且主要是功能性的(我认为;我一点也不沉迷于函数式编程的习语),但是禁止使用 Object.defineProperty
来定义我认为您将拥有的属性最后一步必须执行(设置 Prop ):
const removeZero = item => (
Object
.keys(item)
.filter(key => item[key] !== 0)
.reduce((newObj, key) => {
newObj[key] = item[key];
return newObj;
}, {})
);
const result = removeZero({ a: 0, b: 1, c: -1 });
console.log(result);
我想我们可以在 reduce
中每次都创建一个新对象,但这看起来很浪费:
const removeZero = item => (
Object
.keys(item)
.filter(key => item[key] !== 0)
.reduce((newObj, key) => ({
...newObj, [key]: item[key]
}), {})
);
const result = removeZero({ a: 0, b: 1, c: -1 });
console.log(result);
...但请注意,这依赖于对象传播符号,这是第 3 阶段 proposal (并且可能会出现在 ES2018 中)但尚未出现在规范中。
naomik 指出我们可以避免这样做
newObj[key] = item[key];
return newObj;
部分没有使用 Object.assign
创建新对象,如下所示:
const removeZero = item => (
Object
.keys(item)
.filter(key => item[key] !== 0)
.reduce((newObj, key) => Object.assign(newObj, {[key]: item[key]}), {})
);
const result = removeZero({ a: 0, b: 1, c: -1 });
console.log(result);
我会把它留给比我更多的功能负责人,看看它是否比设置属性和执行 return
的功能更强大。 :-)
关于javascript - 从值为零的对象中删除属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41186717/