繁体   English   中英

基于属性组合对象数组内部数组

[英]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.

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