我有一个类似的数组:
const arr = [
{ id: 123, parent: [345] },
{ id: 811, parent: [456] },
{ id: 987, parent: [876] },
{ id: 811, parent: [137] },
{ id: 811, parent: [825] }
]
标识为811
的对象出现3次。
我需要将其转换为:
const newArr = [
{ id: 123, parent: [345] },
{ id: 811, parent: [456, 137, 825] },
{ id: 987, parent: [876] }
]
也就是说,我需要找到具有多次出现的id的对象,然后将这些对象合并到一个对象中,该对象具有来自所有对象的父值的父数组。
使用lodash方法做到这一点的最佳方法是什么?
答案 0 :(得分:1)
使用lodash,groupBy 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);
答案 1 :(得分:0)
您可以在普通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)