从JS数组中删除重复项

removing duplicates from JS array

本文关键字:删除 JS 数组      更新时间:2023-09-26

我有以下JS数组:

var items=[
    { id: 1, name: 'aa' },
    { id: 1, name: 'bb' },
    { id: 2, name: 'cc' },
    { id: 1, name: 'dd' }
];

我想把它转换成以下内容。

var items=[
    { id: 1, name: 'dd' },
    { id: 2, name: 'cc' }
];

我应该如何使用JavaScript?

实际上,我们可以非常简单地完成这项工作,只需在其上循环即可。对于每个项,将其在新数组中的位置分配给其ID。早期的ID会被覆盖,因此只保存最后一个ID。

var items=[
    { id: 1, name: 'aa' },
    { id: 1, name: 'bb' },
    { id: 2, name: 'cc' },
    { id: 1, name: 'dd' }
], newItems = [];
for (var i =0;i<items.length;i++){
    newItems[items[i].id - 1] = items[i];
}
alert(JSON.stringify(newItems));

试试这个:

items = items.reverse().filter((function() {
    var existing = {};
    return function(item) {
        if(existing[item.id]) {
            return false;
        }
        existing[item.id] = true;
        return item;
    }
}()));

这应该可以实现您想要的:

var items = [
    { id: 1, name: 'aa' },
    { id: 1, name: 'bb' },
    { id: 2, name: 'cc' },
    { id: 1, name: 'dd' }
];
function removeDupIds(items){
    var result  = [],
        uniqIds = {},
        i       = 0,
        l       = items.length;
    for(; i<l; i++){
        uniqIds[items[i].id] = items[i].name;
    }
    for(var k in uniqIds){
        result.push({id: k, name: uniqIds[k]});
    }
    return result;
}
console.log(removeDupIds(items));

如果使用下划线,它将只是

_.uniq(items.reverse(), function(i1, i2) { return i1.id === i2.id; }))

通常情况下,_.uniq会删除相同的项,但我们可以将第二个参数传递给它,该参数指定一个函数,用于确定是否将两个项视为相同。

需要items.reverse(),因为OP似乎希望最后一项优先。