我有一个对象数组:
[
{ id: 1, name: "Bob" },
{ id: 1, name: "Donald" },
{ id: 2, name: "Daryl" }
]
我想删除带有重复ID的对象,留下一个如下所示的数组:
[
{ id: 1, name: "Bob" },
{ id: 2, name: "Daryl" }
]
我不关心剩下哪些对象,只要每个ID都是唯一的。也许在下划线中有任何东西会这样做吗?
编辑:这与下面列出的副本不同;我不是要尝试过滤重复的OBJECTS,而是包含相同ID的对象。我用Underscore完成了这个 - 我很快就会发布答案。
答案 0 :(得分:2)
var out = arr.reduce(function (p, c) {
// if the next object's id is not found in the output array
// push the object into the output array
if (!p.some(function (el) { return el.id === c.id; })) p.push(c);
return p;
}, []);
答案 1 :(得分:1)
如果您使用underscore
,则可以使用_uniq
方法
var data = [
{ id: 1, name: "Bob" },
{ id: 1, name: "Donald" },
{ id: 2, name: "Daryl" }
]
_.uniq(data, function(d){ return d.ID });
使用===生成数组的无副本版本,以测试对象相等性。特别是仅保留每个值的第一次出现。如果您事先知道数组已排序,则为isSorted传递true将运行更快的算法。如果要根据转换计算唯一项,请传递iteratee函数。
答案 2 :(得分:1)
es6方式
function removeDuplicates(myArr, prop) {
return myArr.filter((obj, pos, arr) => {
return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos
})
}
测试
let a =[
{ id: 1, name: "Bob" },
{ id: 1, name: "Donald" },
{ id: 2, name: "Daryl" }
]
console.log( removeDuplicates( a, 'id' ) )
//output [
{ id: 1, name: "Bob" },
{ id: 2, name: "Daryl" }
]
答案 3 :(得分:0)
您可以简单地过滤数组,但是您需要一个已经使用过的现有ID的索引...
var ids = [];
var ar = [
{ id: 1, name: "Bob" },
{ id: 1, name: "Donald" },
{ id: 2, name: "Daryl" }
];
ar = ar.filter(function(o) {
if (ids.indexOf(o.id) !== -1) return false;
ids.push(o.id);
return true;
});
console.log(ar);
以下是filter()
...
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
答案 4 :(得分:0)
可以使用es6 Map collection with reduce
const items = [
{ id: 1, name: "Bob" },
{ id: 1, name: "Donald" },
{ id: 2, name: "Daryl" }
]
const uniqItems = [...items.reduce((itemsMap, item) =>
itemsMap.has(item.id) ? itemsMap : itemsMap.set(item.id, item)
, new Map()).values()]
console.log(uniqItems);