2017-01-13 65 views
0

我有一个对象数组,我想删除重复的项目。下面讨论的话题,不过ES6的解决方案似乎没有使用对象的工作: Unique values in an arraynode:从阵列中删除重复的对象

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

回答

2

使用_.uniqBy或lodash _.uniqWith;)

const _ = require('lodash'); 
 

 
const myArray=[{fname:"Bob", sname:"Brown"},{fname:"Jill",sname:"White"},{fname:"Bob", sname:"Brown"}]; 
 

 
console.log(_.uniqWith(myArray, _.isEqual));

+0

+我为正确的工作使用正确的工具。 – rsp

+0

代码作品谢谢你。无法理解uniq.js,uniqBy.js和uniqWith.js – Dercni

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; 
} 

希望这有助于:)

2

随着lodash您可以使用_.uniqBy_.uniqWith - 看到史蒂芬L上的答案eclerc。

参见:https://lodash.com/了解详情。

如果您认真对待编写代码,那么您不应该为这种简单情况重新发明轮子。

如果你想知道如何正确地执行它,看到源代码在这里:

请记住,当你使用JSON.stringify那么首先你必须把它一个try/catch块内,因为你的程序将一些数据崩溃(或你应该使用tryjson - 免责声明,我是该模块的作者),并且您将获得不同但具有相同JSON序列化的对象的误报。

+0

_之间的区别。uniq不管理对象阵列 – Mech45

+0

@StevenLeclerc谢谢。我更新了我的答案,并提到了你的答案。 – rsp

0

没有lodash:

function removeDuplicates(myArr, prop) { 
    return myArr.filter((element, pos, arr) => { 
    return arr.map(mapObj => mapObj[prop]).indexOf(element[prop]) === pos; 
    }); 
} 
-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' }] 
*/ 

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