es6 Array Reduce 句柄第一个被减少的项目

es6 Array Reduce handle first item being reduced

我想使用 array reduce 按键对数组中的项目进行分组。

当我使用下面的 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'))

如果 obj[item[key]]undefined(因为 undefined 为假),您可以使用 obj[item[key]] || [] 使其使用空数组。

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

您需要一个递归函数来首先遍历数组的深度,然后 return 对象值。

函数 recurCheck(你的数组,键){ //如果数组在数组中 recurCheck(newArray,key) //别的 在这里添加你的 reduce 函数 return }