Javascript`过滤器`+`减少`VS`reduce` +`if`

时间:2018-04-15 13:32:45

标签: javascript ecmascript-5

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删除一些属性。

首选哪种方式?为什么?

2 个答案:

答案 0 :(得分:3)

总是取决于。

第一个案例 - reduce里面有条件 - 你只需将数据集循环一次。

第二种情况为您提供了两个循环(第二种情况适用于有限数据集),但代码更易读,操作分离(过滤/修改数据)。

答案 1 :(得分:0)

我更喜欢完全必要的方法

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;
}