2017-09-27 87 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,鍵) //別的 此處添加您減少功能,並返回 }