代码之家  ›  专栏  ›  技术社区  ›  Avery235

Javascript“filter”+“reduce”与“reduce”+“if”[关闭]

  •  0
  • Avery235  · 技术社区  · 6 年前
    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 回复  |  直到 6 年前
        1
  •  5
  •   hsz    6 年前

    这要看情况而定。

    第一个案例- reduce 使用内部条件-只需循环一次数据集。

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

        2
  •  1
  •   Bergi    6 年前

    我宁愿采用完全强制性的方法

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