2017-01-13 98 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' }] 
*/ 

您必須手動比較兩個對象內容並刪除任何重複項。