[英]What is the best way to merge nested arrays
I have an array of objects that looks like this:我有一个看起来像这样的对象数组:
[
{external_id: 1, items: [{k: 'v'}] },
{external_id: 2, items: [{k1: 'v1'}] },
{external_id: 1, items: [{k2: 'v2'}, {k3: 'v3'}] }
]
What I want to do is merge nested arrays based on external_id
and return 'clean array' which will look like this:我想要做的是基于
external_id
合并嵌套的 arrays 并返回“干净数组”,如下所示:
[
{external_id: 1, items: [{k: 'v'}, {k2: 'v2'}, {k3: 'v3'}] },
{external_id: 2, items: [{k1: 'v1'}] }
]
So my question is what is the clean way to achieve that without using classic for-loop?所以我的问题是在不使用经典 for 循环的情况下实现这一目标的干净方法是什么?
Using reduce and sort使用归约和排序
let data = [{ external_id: 1, items: [{ k: 'v' }] }, { external_id: 2, items: [{ k1: 'v1' }] }, { external_id: 1, items: [{ k2: 'v2' }, { k3: 'v3' }] }, ]; let ans = data.sort(function(a, b) { return a['external_id'] - b['external_id']; }).reduce((acc, currentObject) => { const endObject = acc[acc.length - 1]; if (endObject && endObject['external_id'] === currentObject.external_id) { endObject.items.push(...currentObject.items); } else { acc.push({...currentObject }); } return acc; }, []); console.log(ans);
You will have to loop.你将不得不循环。 You can choose to loop with
for
, forEach
, map
, reduce
, find
, ...etc, but you'll have to loop.您可以选择使用
for
、 forEach
、 map
、 reduce
、 find
等循环,但您必须循环。
Here is a way that creates a Map keyed by the external_id, and then populates that map with the items.这是一种创建由 external_id 键入的 Map 的方法,然后使用项目填充 map。 Finally the values of that map represent the result:
最后,map 的值代表结果:
let data = [{external_id: 1, items: [{k: 'v'}] },{external_id: 2, items: [{k1: 'v1'}] },{external_id: 1, items: [{k2: 'v2'}, {k3: 'v3'}] }]; let map = new Map(data.map(({external_id}) => [external_id, { external_id, items:[] }])); data.forEach(o => map.get(o.external_id).items.push(...o.items)); let result = [...map.values()]; console.log(result);
using another object to group objects with same external_id property使用另一个 object 对具有相同 external_id 属性的对象进行分组
let a = [
{external_id: 1, items: [{k: 'v'}] },
{external_id: 2, items: [{k1: 'v1'}] },
{external_id: 1, items: [{k2: 'v2'}, {k3: 'v3'}] }
]
let obj = {};
a.forEach( ({external_id, items}) => {
obj[external_id] ??= new Set;
items.map( i => {
obj[external_id].add(JSON.stringify(i));
});
});
a = Object.keys(obj).map( (n) => {
n = Number(n);
return {
external_id:n,
items: [...obj[n]].map(JSON.parse)
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.