如何使用Javascript合并对象数组中的公共属性?

时间:2018-07-06 11:09:03

标签: javascript

这是我的数据。

[
 {
  "author":
   {
     "id":"101",
     "label:"abc"
   },
   "books":
   {
      "id":"1"
   }
 },
  {
   "author":
   {
     "id":"101",
     "label:"abc"
   },
   "books":
   {
      "id":"2"
   }
  }
]

在上面包含对象列表的数组中,第一个对象的第一个属性和第二个对象的第一个属性值在任何时候都是相同的,但是其余属性值每次都不同。所以将不同的属性值推入一个数组,如,我想得到这样的输出

输出:-

[
{
   "author":
   {
     "id":"101",
     "label:"abc",
     "books":[
      {"id":"1"},
      {"id":"2"}
      ]
   }
}
]

1 个答案:

答案 0 :(得分:0)

我可以为您提供帮助;)您可以使用Array.prototype.reduce和ES6深度对象结构分解分配来聚合数据,并使用Array.prototype.map-生成所需的输出:

const data = [{author:{id:"101",label:"abc"},books:{id:"1"}},{author:{id:"101",label:"abc"},books:{id:"2"}}];

const dataObj = data.reduce((all, { author: { id: author_id, label }, books: { id: book_id } }) => {

    if (!all.hasOwnProperty(author_id)) {
        all[author_id] = { id: author_id, label, books: [] };
    }

    all[author_id].books.push({ id: book_id });

    return all;

}, {});

const result = Object.keys(dataObj).map(k => ( { author: dataObj[k] } ) );

console.log(result);