2017-09-27 108 views
0

我想使用数组减少按键组合我的数组中的项目。es6阵列减少处理第一个项目正在减少

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

+1

'arr.reduce(( obj,item,index)'...检查索引是否为0,并更改逻辑以适合 –

+0

感谢@JaromandaX它看起来好像我甚至不需要更改逻辑,只需将'index'添加到'groupByIDErr '并且按预期工作 – ak85

+1

@ ak85如果您自己解决了您的问题,请将您的解决方案发布在答案中并接受答案,以便其他人可以从您如何解决问题中获益。 – 4castle

回答

1

您可以使用obj[item[key]] || [],以使其使用一个空数组,如果obj[item[key]]undefined(因为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%; }

0

你需要一个递归函数先通过一个数组的深度,然后返回对象值。

功能recurCheck(您的数组,键){// 如果阵列阵列 recurCheck内(newArray,键) //别的 此处添加您减少功能,并返回 }