2017-01-24 5 views
0

ist Ich habe 2 Objekt-Arrays (allUsers und friendsOnTrip). Beide Arrays haben das gleiche Format. Jedes Objekt in ihnen enthält Details eines Benutzers (d. H. firstName und lastName). Ich versuche es so zu machen, dass wenn ein Objekt in einem Array nicht in dem anderen ist, dann schiebe dieses Objekt auf ein neues Array, sonst nicht.Objekt nicht innerhalb des Arrays gefunden, obwohl es

allUsers.forEach((user) => { 
    if (friendsOnTrip.indexOf(user) <= -1) { 
     this._friendsNotOnTrip.push(user); 
    } 
}); 

Das Problem ist, dass selbst wenn das Objekt user scheint, wie es in friendsOnTrip ist, dann ist der Ausdruck:

if (friendsOnTrip.indexOf(user) <= -1) 

... wertet noch true(was falsch ist) also ich am Ende mit this._friendsNotOnTrip Objekte, die nicht da sein sollte.

Ein Beispiel für eines der Objekte:

{ 
    email: "[email protected]", 
    firstName: "foo", 
    lastName: "bar", 
    key: "123456789", 
    friends: [ 
     "987654321", 
     "246808642" 
    ], 
    location: { 
     lng: -1.24567, 
     lat: 50.9865 
    }, 
    usersToSeeLocation: [ 
     "987654321" 
    ] 
} 

das Objekt an der Position 0 in allUsers und das Objekt an der Position 0 in friendsOnTrip sind das gleiche Objekt. Getestet habe ich die einzelne Attribute und bekam folgende Ergebnisse:

console.log(allUsers[0].firstName === friendsOnTrip[0].firstName);     //true 
console.log(allUsers[0].lastName === friendsOnTrip[0].lastName);      //true 
console.log(allUsers[0].email === friendsOnTrip[0].email);       //true 
console.log(allUsers[0].friends === friendsOnTrip[0].friends);      //false 
console.log(allUsers[0].key === friendsOnTrip[0].key);        //true 
console.log(allUsers[0].location === friendsOnTrip[0].location);      //false 
console.log(allUsers[0].usersToSeeLocation === friendsOnTrip[0].usersToSeeLocation); //false 

console.log(allUsers[0] === friendsOnTrip[0]);          //false 

innen friends Sehen, usersToSeeLocation und location sowohl allUsers[0] und friendsOnTrip[0], die Inhalte sind exakt die gleiche, so ich bin nicht sicher, warum diese Ausdrücke auswerten zu false.

+1

zu tun, Sie‘ nicht das gleiche Objekt. Sie enthalten die gleichen Informationen, aber sie sind immer noch ein Objekt mit unterschiedlichem Speicherplatz im Speicher. –

+1

Mögliches Duplikat von [Object comparison in JavaScript] (http://stackoverflow.com/questions/1068834/object-comparison-in-javascript) – sabithpocker

+0

Haben beide "Objekte" gleiche Schlüssel und Werte? Wenn ja, können Sie mit ** JSON.stringify ** beide Objekte versuchen und dann vergleichen. Wenn beide "Objekte" denselben Schlüssel haben, aber unterschiedliche Werte haben, muss es "return" false sein. –

Antwort

3

Sie können Objekte wie diese nicht vergleichen. Zum Beispiel

gibt -1 zurück. Stattdessen sollten Sie für eine bestimmte Eigenschaft suchen, so etwas wie

allUsers.forEach((user) => { 
    if (friendsOnTrip.map(u => u.key).indexOf(user.key) <= -1) { 
     this._friendsNotOnTrip.push(user); 
    } 
}); 
+0

möglicherweise die E-Mail. –

+0

Sie könnten auch eine Zeichenfolge aus mehreren Eigenschaften erstellen, indem Sie sie verketten – fafl

+0

Das hat funktioniert, danke! Ich hatte komplett vergessen, '.map()' zu verwenden – wmash

0

„Blick ins Innere Freunde, usersToSeeLocation, und die Lage in beiden allusers [0] und friendsOnTrip [0], sind die Inhalte genau das gleiche, so bin ich nicht sicher warum diese Ausdrücke zu falsch ausgewertet werden. "

das ist, weil sie nicht gleich sind. Sie haben den gleichen Wert, aber sie sind nicht das gleiche Objekt! Aus diesem Grund Ihre „===“ false zurück Sie haben alle Indizes vergleichen mit einem

Sie können array1.join tun() === array2.join() Ihre comparition schneller

Verwandte Themen