Javascript 节点:从阵列中删除重复对象
我有一个对象数组,我想删除重复的项目。以下讨论了该主题,但ES6解决方案似乎不适用于对象:Javascript 节点:从阵列中删除重复对象,javascript,arrays,node.js,Javascript,Arrays,Node.js,我有一个对象数组,我想删除重复的项目。以下讨论了该主题,但ES6解决方案似乎不适用于对象: 一个解决方案是在一个小的修改后使用您提到的相同的解决方案;由于不可能将对象用作键,我们可以将其用作JSON,即字符串: Array.prototype.getUnique = function() { var u = {}, a = []; for(var i = 0, l = this.length; i < l; ++i) { var index = JSON.
一个解决方案是在一个小的修改后使用您提到的相同的解决方案;由于不可能将对象用作键,我们可以将其用作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;
}
Array.prototype.getUnique=function(){
变量u={},a=[];
对于(变量i=0,l=this.length;i
希望这对您有所帮助:)一个解决方案是,在进行一个小的修改后,使用您提到的相同的解决方案;由于不可能将对象用作键,我们可以将其用作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;
}
Array.prototype.getUnique=function(){
变量u={},a=[];
对于(变量i=0,l=this.length;i
希望这有帮助:)使用lodash的qby或qwith;)
const=require('lodash');
const myArray=[{fname:“Bob”,sname:“Brown”},{fname:“Jill”,sname:“White”},{fname:“Bob”,sname:“Brown”}];
log(q.uniqWith(myArray,q.isEqual))代码>使用lodash的qby或qwith;)
const=require('lodash');
const myArray=[{fname:“Bob”,sname:“Brown”},{fname:“Jill”,sname:“White”},{fname:“Bob”,sname:“Brown”}];
log(q.uniqWith(myArray,q.isEqual))代码>对于lodash,您可以使用.uniqBy
或.uniqWith
——请参阅Steven Lecler的答案
有关详细信息,请参阅
如果你对编写代码是认真的,那么你就不应该为这样的简单情况重新发明轮子
如果您想知道如何正确实现它,请参阅此处的源代码:
请记住,当您使用JSON.stringify时,首先必须将其放入try/catch块中,因为您的程序会因某些数据而崩溃(或者您应该使用-disclaimer,我是该模块的作者)您将得到不同但具有相同JSON序列化的对象的误报。对于lodash,您可以使用.uniqBy
或.uniqWith
——请参阅Steven Leclerc的答案
有关详细信息,请参阅
如果你对编写代码是认真的,那么你就不应该为这样的简单情况重新发明轮子
如果您想知道如何正确实现它,请参阅此处的源代码:
请记住,当您使用JSON.stringify时,首先必须将其放入try/catch块中,因为您的程序会因某些数据而崩溃(或者您应该使用-disclaimer,我是该模块的作者)并且您将获得不同但具有相同JSON序列化的对象的误报。不使用lodash:
function removeDuplicates(myArr, prop) {
return myArr.filter((element, pos, arr) => {
return arr.map(mapObj => mapObj[prop]).indexOf(element[prop]) === pos;
});
}
不含lodash:
function removeDuplicates(myArr, prop) {
return myArr.filter((element, pos, arr) => {
return arr.map(mapObj => mapObj[prop]).indexOf(element[prop]) === pos;
});
}
在这里,第一个和最后一个元素并不代表相同的对象,所以它不会从集合中移除
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' }]
*/
您必须手动比较两个对象内容,并删除任何重复项。此处第一个和最后一个元素不代表相同的对象,因此不会从集合中删除它
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' }]
*/
您必须手动比较两个对象内容,并删除所有重复项。@StevenLeclerc谢谢。我更新了我的答案,也参考了你的答案。@StevenLeclerc谢谢。我更新了我的答案,也参考了你的答案。代码有效,谢谢。在理解uniq.js、uniqBy.js和uniqWith.jsCode之间的区别时遇到困难,谢谢。无法理解uniq.js、uniqBy.js和uniqWith.js之间的区别