![](/img/trans.png)
[英]How to group by more than one key and sum its values in an array of objects, using Lodash?
[英]JS/Lodash - Group values which occur more than once?
我有一個類似的數組:
const arr = [
{ id: 123, parent: [345] },
{ id: 811, parent: [456] },
{ id: 987, parent: [876] },
{ id: 811, parent: [137] },
{ id: 811, parent: [825] }
]
ID為811
的對象出現3次。
我需要將其轉換為:
const newArr = [
{ id: 123, parent: [345] },
{ id: 811, parent: [456, 137, 825] },
{ id: 987, parent: [876] }
]
也就是說,我需要找到一個ID出現多次的對象,然后將這些對象合並到一個對象中,該對象具有所有對象的父值的父數組。
使用lodash方法執行此操作的最佳方法是什么?
使用lodash,通過id
分組,合並每個組,並合並數組:
const arr = [{"id":123,"parent":[345]},{"id":811,"parent":[456]},{"id":987,"parent":[876]},{"id":811,"parent":[137]},{"id":811,"parent":[825]}]; const result = _(arr) .groupBy('id') .map((group) => _.mergeWith({}, ...group, (o1, o2) => Array.isArray(o1) ? o1.concat(o2) : undefined )) .value(); console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
或使用ES6,對Array#reduce
和Map
:
const arr = [{"id":123,"parent":[345]},{"id":811,"parent":[456]},{"id":987,"parent":[876]},{"id":811,"parent":[137]},{"id":811,"parent":[825]}]; const result = [...arr.reduce((map, obj) => { const group = map.get(obj.id) || { id: obj.id, parent: [] }; group.parent.push(...obj.parent); return map.set(obj.id, group); }, new Map()).values()]; console.log(result);
您可以在普通js中使用reduce()
方法來執行此操作,只需跟蹤對象ID即可,並且可以為此使用另一個對象。
const arr = [ { id: 123, parent: [345] }, { id: 811, parent: [456] }, { id: 987, parent: [876] }, { id: 811, parent: [137] }, { id: 811, parent: [825] } ] var o = {} var result = arr.reduce(function(r, e) { if(!o[e.id]) o[e.id] = e, r.push(o[e.id]) else o[e.id].parent.push(...e.parent) return r; }, []) console.log(result)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.