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



我有一个对象数组,由于与另一个数据集的连接,这些对象具有重复的唯一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,但在这里无法实现我需要的功能。

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

该方法使用函数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; }

您可以使用用Object.values:包装的reduce来完成此操作

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字符串。

最新更新