我有一个对象数组,我想删除重复的项目。以下讨论了该主题,但ES6解决方案似乎不适用于对象: Unique values in an array
var myArray=[{fname:"Bob", sname:"Brown"},{fname:"Jill",sname:"White"},{fname:"Bob", sname:"Brown"}];
var unique = myArray.filter((v, i, a) => a.indexOf(v) === i);
/*
[ { fname: 'Bob', sname: 'Brown' },
{ fname: 'Jill', sname: 'White' },
{ fname: 'Bob', sname: 'Brown' } ]
*/
let unique = [...new Set(myArray)];
/*
[ { fname: 'Bob', sname: 'Brown' },
{ fname: 'Jill', sname: 'White' },
{ fname: 'Bob', sname: 'Brown' } ]
*/
答案 0 :(得分:2)
使用来自lodash的_.uniqBy或_.uniqWith;)
const _ = require('lodash');
const myArray=[{fname:"Bob", sname:"Brown"},{fname:"Jill",sname:"White"},{fname:"Bob", sname:"Brown"}];
console.log(_.uniqWith(myArray, _.isEqual));

答案 1 :(得分:2)
使用lodash,您可以使用_.uniqBy
或_.uniqWith
- 请参阅Steven Leclerc的回答。
有关详细信息,请参阅:https://lodash.com/。
如果你认真编写代码,那么你就不应该为这样的简单案例重新发明轮子。
如果您想知道如何正确实现它,请参阅此处的源代码:
请记住,当您使用JSON.stringify时,首先必须将其放在try / catch块中,因为您的程序会因某些数据而崩溃(或者您应该使用tryjson - 免责声明,I是该模块的作者,并且您会得到不同但具有相同JSON序列化的对象的误报。
答案 2 :(得分:0)
解决方案是使用您在稍作修改后提到的相同解决方案;因为使用对象作为键是不可能的,我们可以将它们用作JSON,即字符串:
Array.prototype.getUnique = function() {
var u = {}, a = [];
for(var i = 0, l = this.length; i < l; ++i) {
var index = JSON.stringify(this[i]);
if(u.hasOwnProperty(index)) {
continue;
}
a.push(this[i]);
u[index] = 1;
}
return a;
}
希望这会有所帮助:)
答案 3 :(得分:0)
没有lodash:
function removeDuplicates(myArr, prop) {
return myArr.filter((element, pos, arr) => {
return arr.map(mapObj => mapObj[prop]).indexOf(element[prop]) === pos;
});
}
答案 4 :(得分:-1)
此处第一个和最后一个元素不代表相同的对象,因此不会从集合
中删除它var myArray=[{fname:"Bob", sname:"Brown"},{fname:"Jill",sname:"White"},{fname:"Bob", sname:"Brown"}];
var set1 = new Set(myArray);
console.log([...set1]);
/*
[ { fname: 'Bob', sname: 'Brown' },
{ fname: 'Jill', sname: 'White' },
{ fname: 'Bob', sname: 'Brown' } ]
*/
这里只添加了一个对象,因为它们都是相同的。
var set2 = new Set();
var obj1 = {fname:"Bob", sname:"Brown"};
set2.add(obj1);
set2.add(obj1);
console.log([...set2]);
/*
[ { fname: 'Bob', sname: 'Brown' }]
*/
您必须手动比较两个对象内容,并删除任何重复内容。