2017-01-13 25 views
0

Ich habe ein Array von Objekten, und ich möchte doppelte Elemente entfernen. Im Folgenden diskutiert das Thema jedoch die ES6 Lösungen scheinen nicht mit Objekten zu arbeiten: Unique values in an arrayKnoten: Entfernen von doppelten Objekten aus 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' } ] 
*/ 

Antwort

2

Verwenden _.uniqBy oder _.uniqWith von lodash;)

const _ = require('lodash'); 
 

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

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

+0

+ Ich für die Verwendung des richtigen Tools für den richtigen Job. – rsp

+0

Code funktioniert dankeschön. Probleme beim Verständnis des Unterschieds zwischen uniq.js, uniqBy.js und uniqWith.js – Dercni

0

Eine Lösung wäre, die gleiche Lösung zu verwenden, die Sie nach einer kleinen Veränderung im Sinne; als Objekte wie Tasten nicht möglich ist, können wir sie als JSON verwenden können, die Zeichenfolge ist:

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

this helps :)

2

Mit lodash Sie _.uniqBy oder _.uniqWith verwenden können - siehe die Antwort von Steven L eclerc.

Siehe: https://lodash.com/ für Details.

Wenn Sie ernsthaft Code schreiben wollen, sollten Sie das Rad für einfache Fälle wie dieses nicht neu erfinden.

Wenn Sie wissen möchten, wie man es richtig zu implementieren, finden Sie den Quellcode hier:

Beachten Sie, dass, wenn Sie JSON.stringify verwenden dann allererst müssen Sie es innerhalb eines try/catch-Block setzen, weil Ihr Programm für einige Daten zum Absturz bringen (oder sollten Sie tryjson verwenden - Disclaimer , Ich bin der Autor dieses Moduls) und dass Sie falsch positive Ergebnisse von Objekten erhalten, die unterschiedlich sind, aber dieselbe JSON-Serialisierung haben.

+0

_.uniq verwaltet kein Array von Objekt – Mech45

+0

@StevenLeclerc danke. Ich habe meine Antwort aktualisiert und auch auf Ihre verwiesen. – rsp

0

Ohne lodash:

function removeDuplicates(myArr, prop) { 
    return myArr.filter((element, pos, arr) => { 
    return arr.map(mapObj => mapObj[prop]).indexOf(element[prop]) === pos; 
    }); 
} 
-1

Hier erste und das letzte Element nicht gleiche Objekt darstellen, daher ist es nicht von Menge entfernt

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

hier nur ein Objekt hinzugefügt wird, zu setzen, da beide sind gleich.

var set2 = new Set(); 
var obj1 = {fname:"Bob", sname:"Brown"}; 
set2.add(obj1); 
set2.add(obj1); 
console.log([...set2]); 
/* 
[ { fname: 'Bob', sname: 'Brown' }] 
*/ 

Sie müssen den Objektinhalt manuell vergleichen und alle Duplikate entfernen.

Verwandte Themen