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

es6 Array Reduce处理第一个被减少的项

  •  0
  • ak85  · 技术社区  · 7 年前

    当我使用 groupByIDErr obj[item[key]] is not iterable 所以为了让它工作,我使用 groupByID 具有未定义检查的函数,如下所示。

    array reduce有更好的处理方法吗?对于我提供的示例,我在这里所做的很好,但当我必须减少更复杂的数组时,我发现很难维护。

    function groupByIDErr(arr,key){
      return arr.reduce((obj, item) => {
        return {
          ...obj,
          [item[key]]: [
            ...obj[item[key]],
            item
          ]
        }
      }, {})
    }
    
    function groupByID(arr,key){
      return arr.reduce((obj, item) => {
        return {
          ...obj,
          [item[key]]: obj[item[key]] !== undefined ? [
            ...obj[item[key]],
            item
          ]:[item]
        }
      }, {})
    }
    
    const people = [
      {gender:'male', name: 'Tom'},
      {gender:'male', name: 'Richard'},
      {gender:'male', name: 'Harry'},
      {gender:'female', name: 'Sarah'},
      {gender:'female', name: 'Kate'}
    ]
    
    console.log(groupByID(people,'gender'))
    2 回复  |  直到 7 年前
        1
  •  1
  •   castletheperson    7 年前

    您可以使用 obj[item[key]] || [] 为了使其在以下情况下使用空数组: obj[item[key]] undefined (自 未定义 是falsy)。

    function groupByID(arr, key) {
      return arr.reduce((obj, item) => {
        return {
          ...obj,
          [item[key]]: [
            ...obj[item[key]] || [],
            item
          ]
        };
      }, {});
    }
    
    const people = [
      { gender: 'male', name: 'Tom' },
      { gender: 'male', name: 'Richard' },
      { gender: 'male', name: 'Harry' },
      { gender: 'female', name: 'Sarah' },
      { gender: 'female', name: 'Kate' }
    ];
    
    console.log(groupByID(people, 'gender'));
    .as-console-wrapper { min-height: 100%; }
        2
  •  0
  •   user8335505    7 年前

    函数recurCheck(您的数组,键){ recurCheck(newArray,key) //其他 在此处添加reduce函数并返回 }