2017-10-15 5 views
2

Ich versuche, mehrere Objekte, nämlich die Objekte von Array2 in Array1 zu subtrahieren, dh zu entfernen, so dass das Array2 nur das "Jean" -Objekt enthält .Subtrahieren mehrerer Objekte von einem Array mit einem anderen Array

Hilfe! Ich bin verloren.

Ich versuchte mehrere Male Code wie im folgenden Beispiel, aber es hat nicht funktioniert.

array1= [{"caracname" : "charles"}, {"caracname" : "kevin"}] 
 
array2= [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}] 
 
      
 
      array1.forEach(function (k) { 
 
       delete array2[k]; 
 
      }); 
 
      
 
      console.log(array2);

+0

Mögliche duplizieren von [Vergleiche zwei Javascript-Arrays und entferne Duplikate] (https: // stackoverflow.com/questions/14930516/compare-two-javascript-arrays-and-remove-duplikate) –

Antwort

1

Hier ist, wie dies zu tun:

function objectsEqual(o1, o2) { 
    return o1.caracname === o2.caracname 
} 

function subtractArrays(a1, a2) { 
    var arr = []; 
    a1.forEach((o1) => { 
     var found = false; 
     a2.forEach((o2) => { 
      if (objectsEqual(o1, o2)) { 
       found = true; 
      } 
     }); 
     if (!found) { 
      arr.push(o1); 
     } 
    }) 
    return arr; 
} 

console.log(subtractArrays(array2, array1)); 

in Plunker behoben: https://plnkr.co/edit/vA6oWg9R44f6k7ylyFh6?p=preview

+0

Die console.log show undefined: https://plnkr.co/edit/CeQgUyhwh3cpYEPwmD30?p=preview – jean

+0

Fest und hinzugefügt Plumbing – Nayish

+0

Sie kann diesen Code auch auf https://codepen.io/anon/pen/OxBOGy?editors=1111 – slevy1

0

Verwenden Sie diesen Code: [empfohlen von @ slevy1]

var array1= [{"caracname" : "charles"}, {"caracname" : "kevin"}] 
var array2= [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}] 

array1.forEach(function (k) { 
    var index = array1.valueOf(k); 
    array2.splice(index, 1); 
}); 

array2.forEach(function (o) { 
    console.log(o.caracname); 
}); 

codepen link

+0

Ich habe Ihren Code hier https://codepen.io/anon/pen/KXGZPv?editors=1111 und nicht Erhalten Sie das beabsichtigte Ergebnis. – slevy1

+0

Hi @ slevy1, danke für deine Mühe. Ich habe meinen Code bearbeitet (korrigiert) und es funktioniert jetzt. Bitte testen Sie noch einmal, Bruder. – fatih

+0

@Fatih 'index' ist keine Zahl (versuchen Sie' console.log (index) ') und array2.splice entfernt nur das erste Element – Slai

1

Wie sich herausstellt, ist das Löschen eines Array-Elements nicht so einfach wie das Löschen einer Variablen; siehe here. Das "gelöschte" Element wird nicht gelöscht, sondern erhält einen undefinierten Wert, während die Länge des Arrays gleich bleibt.

Einige hilfreiche Hinweise gefunden here.

Die splice() -Methode ändert den Inhalt eines Arrays durch Entfernen vorhandenen Elemente und/oder das Hinzufügen neuer Elemente: So können Sie array2 der splice Methode, die nach MDN handlicher macht folgendes verwenden.

folgenden Ausschnitt arbeitet unabhängig von der Reihenfolge der Elemente in jedem Array wie folgt:

var arr1 = [{ 
 
    "caracname": "charles" 
 
}, { 
 
    "caracname": "kevin" 
 
}]; 
 

 
var arr2 = [{ 
 
    "caracname": "charles" 
 
}, { 
 
    "caracname": "jean" 
 
}, { 
 
    "caracname": "kevin" 
 
}]; 
 

 
var tmp1 = "", 
 
    tmp2 = ""; 
 

 
for (var k = 0, key = "", maxLength = arr1.length; k < maxLength; k++) { 
 
    key = Object.keys(arr1[k])[0]; 
 
    
 
    for (var j = 0, maxLength_2 = arr2.length; j < maxLength_2; j++) { 
 
    
 
    tmp2 = arr2[j][key]; 
 
    tmp1 = arr1[k][key]; 
 
    
 
    if (tmp2 === tmp1) { 
 
     arr2.splice(j, 1); 
 
     maxLength_2--; // array2 length now one less 
 
     break; 
 
    }// end if 
 
    }// end inner-for 
 
}// end outer-for 
 

 
console.log(arr2);

I Dieses Beispiel überarbeitet haben, nachdem der Code here ausgeführt wird, zu verändern einige Variablennamen als Ergebnis.

Nebenbei sollten Sie Ihre Arrays mit var oder optional deklarieren lassen; mehr Infos here und here.

+1

"richtiger" Objektvergleich ist nicht einfach https://Stackoverflow.com/questions/1068834/object-comparison-in-javascript (deshalb habe ich es nicht einmal in meiner Antwort versucht, sondern nur ihre JSON-String-Repräsentationen verglichen, und Nayish vergleicht nur die Werte der caracname Eigenschaften). Das Einfügen von JavaScript im TypeScript https://www.typescriptlang.org/play/ oder einem ähnlichen Editor kann hilfreich sein, um einige der Probleme zu bemerken (nicht sicher, ob das Array aus Object.keys als String '[key]' verwendet wird) – Slai

+0

@Slai Danke für diese Info. Ich habe den Code so korrigiert, dass jetzt der var-Schlüssel einen String-Wert enthält. Getestete Code und es scheint in Ordnung, wenn ich es auf der Typescript-Website ausführen. – slevy1

1

ein bisschen einfacher mit Bibliotheken wie Lodash:

array1 = [{"caracname" : "charles"}, {"caracname" : "kevin"}] 
 
array2 = [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}] 
 

 
array3 = _.differenceWith(array2, array1, _.isEqual) 
 

 
console.log(JSON.stringify(array3)) 
 

 
// or 
 
_.pullAllWith(array2, array1, _.isEqual) 
 

 
console.log(JSON.stringify(array2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

oder etwas weniger effizient, ohne Bibliothek:

array1 = [{"caracname" : "charles"}, {"caracname" : "kevin"}] 
 
array2 = [{"caracname" : "charles"}, {"caracname" : "kevin"}, {"caracname" : "jean"}] 
 

 
j = JSON.stringify, array3 = array2.filter(e => array1.map(j).indexOf(j(e)) < 0) 
 

 
console.log(j(array3))

Verwandte Themen