es6数组减少第一项减少的句柄

时间:2017-09-27 04:55:02

标签: javascript arrays json ecmascript-6 reduce

我想使用数组reduce来通过键对数组中的项进行分组。

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

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

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 个答案:

答案 0 :(得分:1)

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



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




答案 1 :(得分:0)

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

function recurCheck(你的数组,密钥){ //如果数组在数组内 recurCheck(newArray,密钥) //其他 在这里添加你的reduce函数并返回 }