[英]Converting array of javascript objects to key-value pairs of arrays based on property using ES6
[英]JavaScript ES6: array of objects to array grouped by key and indexed by property
我有一個對象數組。 簡化版(只有幾個屬性):
let d = [
{ team:"sales", key:"employees", value:24 },
{ team:"sales", key:"floor", value:2 },
{ team:"finance", key:"employees", value:7 },
{ team:"finance", key:"floor", value:2 },
]
想要按team
然后按key
分組,使用純(ES6)JavaScript:
{
sales: {
employees: { team:"sales", key:"employees", value:24 },
floor: { team:"sales", key:"floor", value:2 }
},
finance: {
employees: { team:"finance", key:"employees", value:7 },
floor: { team:"finance", key:"floor", value:2 }
}
}
有點類似於其他問題,但不完全相同。
到目前為止我所擁有的:使用reduce按team
分組:
let groupBy = (data, field) => data.reduce((acc, obj) => Object.assign(acc, { [obj[field]]:( acc[obj[field]] || [] ).concat(obj) }), {})
let result = groupBy(d,'team')
這給出:
{
sales: [
{ team:"sales", key:"employees", value:24 },
{ team:"sales", key:"floor", value:2 }
],
finance: [
{ team:"finance", key:"employees", value:7 },
{ team:"finance", key:"floor", value:2 }
]
}
不確定推薦的方法是按團隊內部的key
級別分組。
不是通過將每個對象連接到一個新數組來累積到一個數組,您可以累積到一個新的對象文字。 您可以通過將累積的對象擴展為新的對象字面量來實現此目的。 然后,同樣,您可以為當前對象團隊傳播累積對象的結果,或者如果不存在則采用默認對象 ( || {}
)。 最后,您可以在obj.key
嵌套對象文字上設置一個新鍵,並將其值設置為當前迭代對象本身。
const data = [ { team:"sales", key:"employees", value:24 }, { team:"sales", key:"floor", value:2 }, { team:"finance", key:"employees", value:7 }, { team:"finance", key:"floor", value:2 }, ]; const groupBy = (array, field) => array.reduce((acc, obj) => ({...acc, [obj[field]]: {...(acc[obj[field]] || {}), [obj.key]: obj}}), {}); console.log(groupBy(data,'team'));
您可以通過檢查和添加新對象來獲取用於分組和減少對象的鍵數組,或者對於最后一個鍵從數據中獲取對象。
let d = [{ team: "sales", key: "employees", value: 24 }, { team: "sales", key:" floor", value: 2 }, { team: "finance", key: "employees", value: 7 }, { team: "finance", key: "floor", value: 2 }], groups = ['team', 'key'], result = d.reduce((acc, obj) => { groups.reduce((o, key, i, { length }) => { const k = obj[key]; return o[k] = o[k] || (i + 1 === length ? obj : {}); }, acc); return acc; }, {}); console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以使用減少
let d = [{ team:"sales", key:"employees", value:24 },{ team:"sales", key:"floor", value:2 },{ team:"finance", key:"employees", value:7 },{ team:"finance", key:"floor", value:2 },] let groupBy = (data, property) => data.reduce((op, inp) => { let prop = inp[property] let key = inp.key op[prop] = op[prop] || {} op[prop][key] = op[prop][key] || {} op[prop][key] = inp return op }, {}) console.log(groupBy(d, 'team'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.