node:从数组中删除重复的对象

时间:2017-01-13 10:30:21

标签: javascript arrays node.js

我有一个对象数组,我想删除重复的项目。以下讨论了该主题,但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' } ]
*/

5 个答案:

答案 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' }]
*/

您必须手动比较两个对象内容,并删除任何重复内容。