JS-将具有重复项的数组中的唯一列连接起来

时间:2018-11-09 22:18:45

标签: javascript

我有一个对象数组,这些对象由于与另一个数据集的连接而具有重复的唯一ID。这是由于API返回数据的限制。我要做的是查找重复的行,并在JavaScript中加入数据的唯一列。例如,这就是我所拥有的:

var data = [
  {id: 1, name: 'Joe', type:'Red'},
  {id: 2, name: 'Smith', type:'Red'},
  {id: 2, name: 'Smith', type:'Green'},
  {id: 3, name: 'Ana', type:'Blue'},
];

这是我需要的结果:

var data = [
  {id: 1, name: 'Joe', type:'Red'},
  {id: 2, name: 'Smith', type:'Red, Green'},
  {id: 3, name: 'Ana', type:'Blue'},
];

我认为我可以创建一个嵌套的for循环,但是我认为从性能角度来看,它不是理想的选择。我尝试使用Array.prototype.filter,但无法实现此处所需的功能。

2 个答案:

答案 0 :(得分:3)

我建议您使用多种类型的数组,它更干净且可重复使用。

此方法使用功能Array.prototype.reduce将对象按id分组,并使用功能Object.values提取分组的对象。

var data = [  {id: 1, name: 'Joe', type:'Red'},  {id: 2, name: 'Smith', type:'Red'},  {id: 2, name: 'Smith', type:'Green'},  {id: 3, name: 'Ana', type:'Blue'}],
    result = Object.values(data.reduce((a, c) => {
      (a[c.id] || (a[c.id] = Object.assign({}, c, {type: []}))).type.push(c.type);

      return a;
}, Object.create(null)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:3)

您可以用reduce包裹Object.values来做到这一点:

var data = [ {id: 1, name: 'Joe', type:'Red'}, {id: 2, name: 'Smith', type:'Red'}, {id: 2, name: 'Smith', type:'Green'}, {id: 3, name: 'Ana', type:'Blue'}, ];

const result = Object.values(data.reduce((r,c) => 
  (r[c.id] ? r[c.id].type = `${r[c.id].type}, ${c.type}` : r[c.id] = c, r), {}))

console.log(result)

这个想法是检查reduce是否存在密钥,如果没有设置密钥,只需简单地连接types字符串。