Javascript `filter` + `reduce` VS `reduce` + `if`

Javascript `filter` + `reduce` VS `reduce` + `if`

Object.entries(obj).reduce((acc, [key, value]) => {
  if (someCondition(key, value)) {
    acc[key] = value;
  }
  return acc;
}, {});


Object.entries(obj)
  .filter(([key, value]) => someCondition(key, value))
  .reduce((acc, [key, value]) => {
    acc[key] = value;
    return acc;
  }, {});

以上两个块做同样的事情:创建一个 obj 的副本,并根据 someCondition.

删除一些属性

首选哪种方式,为什么?

这总是取决于。

对于第一种情况 - reduce 里面有条件 - 你将只循环你的数据集一次。

第二种情况给了你两个循环(第二种在有限的数据集上工作)但代码更具可读性并且操作是分开的(过滤/修改数据)。

我更喜欢完全命令式的方法

function filterProperties(obj, predicate) {
    const res = {};
    for (const key in obj) {
        const val = obj[key];
        if (predicate(key, var))
            res[key] = val; 
    }
    return res;
}

或完全实用的方法

function filterProperties(obj, predicate) {
    return fromEntries(Object.entries(obj).filter(entry => predicate(...entry)));
}
function fromEntries(entries) {
    const res = {};
    for (const [key, val] of entries) // using `reduce` is not much of an advantage here
        res[key] = val;
    return res;
}