简体   繁体   English

合并嵌套 arrays 的最佳方法是什么

[英]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.您可以选择使用forforEachmapreducefind等循环,但您必须循环。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM