Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 合并嵌套数组的最佳方法是什么_Javascript_Arrays_Javascript Objects - Fatal编程技术网

Javascript 合并嵌套数组的最佳方法是什么

Javascript 合并嵌套数组的最佳方法是什么,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一个如下所示的对象数组: [ {external_id: 1, items: [{k: 'v'}] }, {external_id: 2, items: [{k1: 'v1'}] }, {external_id: 1, items: [{k2: 'v2'}, {k3: 'v3'}] } ] [ {external_id: 1, items: [{k: 'v'}, {k2: 'v2'}, {k3: 'v3'}] }, {external_id: 2, items: [{k1: 'v

我有一个如下所示的对象数组:

[
 {external_id: 1, items: [{k: 'v'}] },
 {external_id: 2, items: [{k1: 'v1'}] },
 {external_id: 1, items: [{k2: 'v2'}, {k3: 'v3'}] }
]
[
 {external_id: 1, items: [{k: 'v'}, {k2: 'v2'}, {k3: 'v3'}] },
 {external_id: 2, items: [{k1: 'v1'}] }
]
我要做的是基于
外部\u id
合并嵌套数组,并返回“clean array”,如下所示:

[
 {external_id: 1, items: [{k: 'v'}] },
 {external_id: 2, items: [{k1: 'v1'}] },
 {external_id: 1, items: [{k2: 'v2'}, {k3: 'v3'}] }
]
[
 {external_id: 1, items: [{k: 'v'}, {k2: 'v2'}, {k3: 'v3'}] },
 {external_id: 2, items: [{k1: 'v1'}] }
]
所以我的问题是,如果不使用classic for loop,实现这一点的干净方法是什么?

您必须循环。您可以选择使用
for
forEach
map
reduce
find
,…等循环,但必须循环

下面是一种创建由外部_id设置关键字的映射的方法,然后用项目填充该映射。最后,该映射的值表示结果:

let data=[{external_id:1,items:[{k:'v'}]},{external_id:2,items:[{k1:'v1'}]},{external_id:1,items:[{k2:'v2'},{k3:'v3'}]}];
让map=newmap(data.map({external_id})=>[external_id,{external_id,items:[]}]);
data.forEach(o=>map.get(o.external_id.items.push(…o.items));
让结果=[…map.values()];
控制台日志(结果)使用reduce和sort

let数据=[{
外部识别号:1,
项目:[{
k:‘v’
}]
},
{
外部识别号:2,
项目:[{
k1:‘v1’
}]
},
{
外部识别号:1,
项目:[{
k2:‘v2’
}, {
k3:‘v3’
}]
},
];
设ans=数据
.排序(功能(a、b){
返回a['external_id']-b['external_id'];
})
.reduce((acc,currentObject)=>{
const endObject=acc[acc.length-1];
if(endObject&&endObject['external\u id']==currentObject.external\u id){
endObject.items.push(…currentObject.items);
}否则{
acc.push({…currentObject)
});
}
返回acc;
}, []);

控制台日志(ans)使用另一个对象对具有相同外部\u 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)
    }
})

数组有多长?数组的
长度
=10我强烈建议您阅读javascript数组的文档:对象基础:谢谢,这也是一个很好的解决方案。我希望我能将两个答案都标为接受:)