Javascript从对象数组中删除重复值

时间:2016-04-22 07:54:34

标签: javascript

我需要将下面的对象数组转换为上述结果。

str.replace(/\bmarine\b/i)

结果

list = [{name : 'John', id : '1'}, {name : 'John', id : '2'}, {name : 'John', id : '3'}, {name : 'John', id : '4'}];

怎么能这样做?

3 个答案:

答案 0 :(得分:3)

您可以使用临时对象和Array#filter来过滤掉重复项并同时修改原始文件:



var list = [
        {name : 'John', id : '1'},
        {name : 'John', id : '2'},
        {name : 'John', id : '3'},
        {name : 'John', id : '4'}
    ],
    temp = {};

list = list.filter(function (o) {
    if (temp.hasOwnProperty(o.name)) {
        temp[o.name].id += ', ' + o.id;
        return false;
    }
    else {
        temp[o.name] = o;
        return true;
    }
});

document.body.textContent = JSON.stringify(list);




答案 1 :(得分:1)

您可以借助于一个temoprary对象在一个循环中对其进行分组,而不会改变原始数组。



var list = [{ name: 'John', id: '1' }, { name: 'John', id: '2' }, { name: 'John', id: '3' }, { name: 'John', id: '4' }],
    grouped = [];

list.forEach(function (a) {
    if (!this[a.name]) {
        this[a.name] = { data: { name: a.name }, array: [] };
        grouped.push(this[a.name].data);
    }
    this[a.name].array.push(a.id);
    this[a.name].data.id = this[a.name].array.join(', ');
}, Object.create(null));

document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

稍微更紧凑的版本

&#13;
&#13;
var list = [{ name: 'John', id: '1' }, { name: 'John', id: '2' }, { name: 'John', id: '3' }, { name: 'John', id: '4' }],
    grouped = [];

list.forEach(function (a) {
    if (!this[a.name]) {
        this[a.name] = { name: a.name, id: a.id };
        grouped.push(this[a.name]);
        return;
    }
    this[a.name].id += ', ' + a.id;
}, Object.create(null));

document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 2 :(得分:1)

这是为了解决您的具体问题,而不是更通用的解决方案

function consolidate(list){
    var names={};
    list.forEach(function(e){
        if (!names[e.name]) names[e.name]=[e.id];
        else names[e.name].push(e.id);
    });
    var rtn=[];
    Object.keys(names).forEach(function(n){
        rtn.push({name:n, id:names[n].join(', ')});
    });
    return rtn;
}

基本上使用一个对象来累积数据,然后重新映射回一个数组。