javascript - 从值为零的对象中删除属性

标签 javascript arrays functional-programming

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/

相关文章:

javascript - Bootstrap (4) 可以与 Angular Material (2) 一起集成吗?

javascript - 从 PHP 文件结果自动刷新标题网页

java - 如何制作包含文件目录的字符串数组?

python - 用第二个数组的两个值替换数组的数据

scala - 为什么 Scala 的 LazyList 元素在计算后显示为未评估?

javascript - Laravel 中的 Crypt Decrypt react native 错误

javascript - 尝试在 javascript 中创建一个计数器对象

ios - 在 IBOutletCollection 中交换图像

javascript - 如何在Javascript中用递归替换循环?

javascript - Javascript 中的函数式编程返回值