如何合并对象列表,其中每个对象都有重复的类别和唯一的文章?

时间:2019-03-11 05:07:37

标签: javascript arrays object lodash javascript-objects

我想合并此数据集中的所有@blur对象:

article

如果const data = [ { category: { id: 1, }, article: { title: 'aaa', }, }, { category: { id: 1, }, article: { title: 'bbb', }, }, { category: { id: 2, }, article: { title: 'ccc', }, }, { category: { id: 3, }, article: { title: 'ddd', }, }, { category: { id: 3, }, article: { title: 'eee', }, }, ] 匹配,则在相同的category下。像这样:

category.id

有什么想法吗?很高兴使用Lodash。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用reduce功能。在reduce回调函数内部,使用findIndex检查累加器数组是否有一个对象,其中id与正在迭代的当前对象的ID相同。如果相同,则更新articles数组,否则使用所需的键创建一个新对象并将其推送到累加器数组

const data = [{
    category: {
      id: 1,
    },
    article: {
      title: 'aaa',
    },
  },
  {
    category: {
      id: 1,
    },
    article: {
      title: 'bbb',
    },
  },
  {
    category: {
      id: 2,
    },
    article: {
      title: 'ccc',
    },
  },
  {
    category: {
      id: 3,
    },
    article: {
      title: 'ddd',
    },
  },
  {
    category: {
      id: 3,
    },
    article: {
      title: 'eee',
    },
  }
]


let newData = data.reduce(function(acc, curr) {
  let findIdIndex = acc.findIndex(function(item) {
    return item.category.id === curr.category.id
  });

  if (findIdIndex === -1) {
    acc.push({
      category: {
        id: curr['category']['id']
      },
      articles: [{
        title: curr.article.title
      }]
    })


  } else {
    acc[findIdIndex].articles.push({
      title: curr.article.title
    })

  }
  return acc;
}, []);

console.log(newData)