我有一个对象数组,这些对象由于与另一个数据集的连接而具有重复的唯一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,但无法实现此处所需的功能。
答案 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
字符串。