2014-11-15 8 views
6
Object1 = {connectorIndex: 1, nodeID: 6, Connectors: Object} 
Object2 = {connectorIndex: 1, nodeID: 6, Connectors: Object} 
Connector: {name: "ALAND", key: "", description: "Departure country (country from which the goods are sent)"} 

Es gibt zwei Objekte in einem Array. Die Connector-Objekte sind identisch. Wie entferne ich doppelte Elemente und bekomme das letzte Array mit einem Objekt?doppelte Objekte in einem Array von Objekt in JavaScript

var array = [object 1, object 2]; 

object 2 ist das Duplikat, das aus dem Array entfernt werden soll.

+0

Es gibt keine Duplizierte Objekte, zwei Objekte sind nie gleich, also ist das Vergleichen von Objekten schwierig, wenn es eine andere Möglichkeit gibt, dies zu lösen, ist es wahrscheinlich besser, sonst müssten Sie jede Eigenschaft durch rekursives Iterieren überprüfen, um auch das referenzierte Objekt usw. zu vergleichen – adeneo

Antwort

13

dies würde es tun, wenn Sie nach genauen Übereinstimmungen suchen sind:

function remove_duplicates(objectsArray) { 
    var usedObjects = {}; 

    for (var i=objectsArray.length - 1;i>=0;i--) { 
     var so = JSON.stringify(objectsArray[i]); 

     if (usedObjects[so]) { 
      objectsArray.splice(i, 1); 

     } else { 
      usedObjects[so] = true;   
     } 
    } 

    return objectsArray; 

} 

var objectsArray = [{a:'foo',b:'bar'}, {a:'foo',b:'bar'}]; 
var clean = remove_duplicates(objectsArray); 
+0

funktionierte, aber wenn ich 3 ähnliche Objekte habe, funktioniert es nicht #Jonathan Crowe –

+0

Was sind die Objekte? Dieser Code wird nur exakte Objektübereinstimmungen entfernen. Vielleicht möchten Sie alle übereinstimmenden Daten entfernen, selbst wenn es teilweise Übereinstimmungen gibt? –

+0

Object1 = {connectorIndex: 1, nodeID: 6, Konnektoren: Object} Object2 = {KonnektorIndex: 1, KonnektorID: 6, Konnektoren: Objekt} Object3 = {KonnektorIndex: 1, KonnektorID: 6, Konnektoren: Objekt} Object4 = {connectorIndex: 1, nodeID: 6, Connectors: Object} –

3

Die Herausforderung bei der Verwendung von JSON.stringify ist, dass, wenn das Objekt einen zirkulären Verweis enthalten könnte, dann wird es eine Ausnahme auslösen, z.B

var x1 = {}; 
x1.a = x1; 
JSON.stringify(x1); // <- Uncaught TypeError: Converting circular structure to JSON 

Was jedoch angedeutet, wenn Sie Objekte und keine Werte vergleichen, dann können Sie nicht nur einen Gleichheitsvergleich tun, da dies immer falsch sein wird, für verschiedene Objekte (auch wenn sie die gleichen Eigenschaften haben mit die gleichen Werte).

Wenn Sie einfach wurden Werte zu vergleichen, dann so etwas wie die unten funktionieren würde

var x = [1,2,2,3,4,2,6]; // Source list 
var x2 = [];    // Will hold the de-duped result 
x.forEach(function(elem){if(x2.indexOf(elem) === -1) x2.push(elem);}); 
x2;      // <- [1, 2, 3, 4, 6] 

Wenn Sie Objekteigenschaften auf einer Ebene vergleichen wollen Sie so etwas wie die unten schreiben könnte (es kann ein einfacher Weg sein - nur gepeitscht diese zusammen)

function sameValues(o1, o2){ 
    for(p in o1){ 
     if(o1[p] !== o2[p]) return false; 
    } 
    for(p in o2){ 
     if(o2[p] !== o1[p]) return false; 
    } 
    return true; 
} 

var Object1 = {connectorIndex: 1, nodeID: 6, Connectors: Object}; 
var Object2 = {connectorIndex: 1, nodeID: 6, Connectors: Object}; 
var Object3 = {connectorIndex: 1, nodeID: 7, Connectors: Object}; 
var Object4 = {connectorIndex: 2, nodeID: 7, Connectors: Object}; 
var Object5 = {connectorIndex: 1, nodeID: 7, Connectors: Object}; 
var arr = [Object1, Object2, Object3, Object4, Object5]; 

var result = []; 
arr.forEach(function(e1){ 
    if(!result.some(function(e2){return sameValues(e1,e2);})){ 
     // No existing object with same top level values in target array, so add 
     result.push(e1); 
    } 
}); 
// result will have the 1st, 3rd, and 4th object only 
+0

es funktioniert nur wenn obj1 obj2 sind in ordnung ... wenn obj1 obj4 obj3 wenn es in dieser nicht funktioniert –

+0

Es funktioniert für mich. Sicher kopierst/klebst du richtig? Wenn ich den obigen Code aber mit dem Array als "var arr = [Object1, Object4, Object3, Object2, Object5];" dann sehe ich Object1, Object4 und Object3 in der Ausgabe und die anderen entfernt - was Sie als Object2 und Object 5 erwarten würden, sind Duplikate. –

0

ein Array verwenden zu halten, die Elemente, die Sie bereits Filter haben und verwenden()

var keys = [] 
yourArray.filter(function(v) { 
    if (keys.indexOf(v.whatIAmLookingFor) < 0) { 
    keys.push(v.whatIAmLookingFor) 
    return true 
    } 
    return false 
}) 

Wickeln Sie es in eine Funktion und nennen Sie es einen Tag. Übergeben Sie eine Funktion für den Test und nennen Sie es einen noch besseren Tag.

1

Dies ist, wie ich von Javascript doppelte Objekte entfernen bevorzugen Array-

var fieldArray = [{ "name": "tom", "text": "tasty" },{ "name": "ram", "text": "rty" },{ "name": "ram", "text": "rty" },{ "name": "shyam", "text": "tasty" },{"name": "ram", "text": "rty" },{ "name": "tom", "text": "tasty" }]; 
 
fieldArray = fieldArray.reduce(function(field, e1){ 
 
\t var matches = field.filter(function(e2){return e1.name== e2.name}); 
 
\t if (matches.length == 0){ 
 
\t \t field.push(e1); 
 
\t }return field; 
 
}, []); 
 
alert(JSON.stringify(fieldArray));

Das ist für mich perfekt funktioniert.

0

Nicht sicher, wie performant das ist, aber ich mag es irgendwie für sie Prägnanz ist, funktioniert für mich (seine ES6, aber ich bin sicher, Sie könnten die plain ol‘ES5 heraus):

let dedupe = (arr, keys) => { 
    let deduped = []; 
    arr.forEach(i => { 
    if (deduped.length === 0) { 
     deduped.push(i); 
    } else { 
     let exists = deduped.find(x => { 
     return keys.every(key => { 
      return i[key] === x[key]; 
     }); 
     }); 
     if (!exists) { 
     deduped.push(i); 
     } 
    } 
    }); 
    return deduped; 
}; 

objArr = dedupe(objArr, ['key', 'test', 'foo']); 
Verwandte Themen