Javascript 按键/值合并对象数组

Javascript 按键/值合并对象数组,javascript,arrays,Javascript,Arrays,我有两个单独的对象数组,如果某个特定的键值匹配,我需要根据它们进行合并。在分析数据后可能更有意义: 阵列1 let categories = [ { id: 5, slug: 'category-5', items: [] }, { id: 4, slug: 'category-4', items: [] }, { id: 3, slug: 'category-3', items: [] }, ] 阵列2 let items = [ { id: 5, da

我有两个单独的对象数组,如果某个特定的键值匹配,我需要根据它们进行合并。在分析数据后可能更有意义:

阵列1

let categories = [
    { id: 5, slug: 'category-5', items: []  },
    { id: 4, slug: 'category-4', items: []  },
    { id: 3, slug: 'category-3', items: []  },
]
阵列2

let items = [
    { id: 5, data: [{ title: 'item title', description: 'item description' }] },
    { id: 5, data: [{ title: 'item title 2', description: 'item description 2' }] },
    { id: 4, data: [{ title: 'item title 4', description: 'item description 4' }] },
]
预期产出

let mergedOutput = [
    { id: 5, slug: 'category-5', 
        items: [
            { title: 'item title', description: 'item description' },
            { title: 'item title 2', description: 'item description 2' }
        ]
    },
    { id: 4, slug: 'category-4',
        items: [
            { title: 'item title 4', description: 'item description 4' },
        ]
    },
    { id: 3, slug: 'category-3', items: []  },
]
所以…如果id匹配,我需要将数组2添加到数组1数组1将保持不变,但如果数组2匹配,则数组1的items属性(空)将替换为数组2的data属性

我知道这是一个非常基本/冗余的问题,但我找不到我的用例/对象结构的资源

我可以很容易地用lodash对数组进行分组——因此,如果该库有类似的解决方案——那就太好了!或者只是一些方向就足够了


提前谢谢

您可以循环第一个数组,然后使用
过滤器
获取与当前元素具有相同id的对象,并将该项添加到当前对象中

let类别=[
{id:5,slug:'category-5',items:[]},
{id:4,slug:'category-4',items:[]},
{id:3,slug:'category-3',items:[]},
]
让项目=[
{id:5,数据:[{title:'item title',description:'item description'}]},
{id:5,数据:[{title:'item title 2',description:'item description 2'}]},
{id:4,数据:[{title:'item title 4',description:'item description 4'}]},
]
类别。forEach(功能(e){
var i=items.filter(a=>a.id==e.id).map(a=>a.data);
e、 项目=一;
})

log(categories)
您可以循环第一个数组,然后使用
过滤器
获取与当前元素具有相同id的对象,并将该项添加到当前对象中

let类别=[
{id:5,slug:'category-5',items:[]},
{id:4,slug:'category-4',items:[]},
{id:3,slug:'category-3',items:[]},
]
让项目=[
{id:5,数据:[{title:'item title',description:'item description'}]},
{id:5,数据:[{title:'item title 2',description:'item description 2'}]},
{id:4,数据:[{title:'item title 4',description:'item description 4'}]},
]
类别。forEach(功能(e){
var i=items.filter(a=>a.id==e.id).map(a=>a.data);
e、 项目=一;
})

log(categories)
我会将这些类别设置为哈希映射,键是id,并且只对所有项目进行迭代。
然后得到O(N)解。

我将把类别作为散列映射,键是id,只对所有项目进行迭代。
然后得到O(N)解。

您可以将项目归为以下几类:

let res = items.reduce((a, b) => {
  let it = a.find(e => e.id === b.id);
  if (! it) return a;
  it.items = it.items.concat(b.data);
  return a;
}, categories);
let类别=[{
id:5,
鼻涕虫:“5类”,
项目:[]
},
{
id:4,
鼻涕虫:“4类”,
项目:[]
},
{
id:3,
鼻涕虫:“3类”,
项目:[]
},
];
让项目=[{
id:5,
数据:[{
标题:'项目标题',
说明:“项目说明”
}]
},
{
id:5,
数据:[{
标题:“项目标题2”,
说明:“项目说明2”
}]
},
{
id:4,
数据:[{
标题:“项目标题4”,
说明:“项目说明4”
}]
},
];
让res=项目。减少((a,b)=>{
让它=a.find(e=>e.id==b.id);
如果(!it)返回一个;
it.items=it.items.concat(b.data);
返回a;
},类别);

控制台日志(res)您可以将项目分为以下几类:

let res = items.reduce((a, b) => {
  let it = a.find(e => e.id === b.id);
  if (! it) return a;
  it.items = it.items.concat(b.data);
  return a;
}, categories);
let类别=[{
id:5,
鼻涕虫:“5类”,
项目:[]
},
{
id:4,
鼻涕虫:“4类”,
项目:[]
},
{
id:3,
鼻涕虫:“3类”,
项目:[]
},
];
让项目=[{
id:5,
数据:[{
标题:'项目标题',
说明:“项目说明”
}]
},
{
id:5,
数据:[{
标题:“项目标题2”,
说明:“项目说明2”
}]
},
{
id:4,
数据:[{
标题:“项目标题4”,
说明:“项目说明4”
}]
},
];
让res=项目。减少((a,b)=>{
让它=a.find(e=>e.id==b.id);
如果(!it)返回一个;
it.items=it.items.concat(b.data);
返回a;
},类别);
控制台日志(res)