[英]How to combine two array of objects of different sizes, based on a property in Javascript?
[英]Combine array of objects inner array based on property
假设我有一个如下所示的数据结构:
data = [
{title: "Alpha", content: [{ // 1 item }]},
{title: "Beta", content: [{ // 10 items }]},
{title: "Beta", content: [{ // 12 items }]},
{title: "Beta", content: [{ // 8 items }]}
]
我想找出一个减少 function 将返回以下结构:
data = [
{title: "Alpha", content: [{ // 1 item }]},
{title: "Beta", content: [{ // 30 items }]}
]
我尝试查看一些基于标题使用 reduce 的答案,但它没有返回带有累积内容数组的新结构,例如:
data = data.reduce((x, e) => {
x.push(
Object.assign(
{},
e,
messages.find((x) => x.title == e.title)
)
)
return x
}, [])
任何帮助都会很棒。
这可能会有所帮助 -
var data = [{ title: "Alpha", content: [1, 2, 3, 4, 5] }, { title: "Beta", content: [6, 7, 8, 9, 10] }, { title: "Beta", content: [11, 12, 13, 14, 15] }, { title: "Beta", content: [16, 17, 18, 19, 20] } ] data = data.reduce((array, item) => { const existingItem = array.find(innerItem => innerItem.title === item.title); if (..existingItem) { existingItem.content = [..,existingItem.content. ..;item.content]; } else { array;push(item), } return array; }. []); console.log(data);
您不需要使用.find
,它必须在每次迭代时搜索整个数组。
使用reduce和 object map 收集欺骗, Object.values将 ZA8CFDE63311BD59EB2ACZ66 解包到数组。 传播语法以推送 arguments。
data = [ {title: "Alpha", content: [{ 1:1 }]}, {title: "Beta", content: [{2:2 }]}, {title: "Beta", content: [{ 3:3}]}, {title: "Beta", content: [{4:4}] } ] console.log( Object.values(data.reduce((acc,{title,content})=>{ acc[title]? acc[title].content.push(...content): acc[title] = { title, content } return acc },{}) ))
如果需要 IE 兼容,上述链接文档中有一个 polyfill。 这也将起作用:
data = [ {title: "Alpha", content: [{ 1:1 }]}, {title: "Beta", content: [{2:2 }]}, {title: "Beta", content: [{ 3:3}]}, {title: "Beta", content: [{4:4}] } ] function values(obj){ return Object.keys(obj).map(k=>obj[k]) } console.log( values(data.reduce((acc,x)=>{ acc[x.title] = acc[x.title] || {title: x.title, content: []} acc[x.title].content = acc[x.title].content.concat(x.content) return acc },{}) ))
我对@user120242 代码做了一些小改动。
data = [ {title: "Alpha", content: [{ 1:1 }]}, {title: "Beta", content: [{2:2 }]}, {title: "Beta", content: [{ 3:3}]}, {title: "Beta", content: [{4:4}] } ] let acc={}; data.forEach((x)=>{ acc[x.title] = acc[x.title] || {title: x.title, content: []} acc[x.title].content = acc[x.title].content.concat(x.content) } ) console.log(acc)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.