2017-01-24 9 views
0

2つのオブジェクト配列(allUsersおよびfriendsOnTrip)があります。これらの配列はどちらも同じフォーマットです。その中の各オブジェクトには、ユーザーの詳細(つまり、firstNamelastName)が含まれています。ある配列のオブジェクトが他の配列にない場合は、そのオブジェクトを新しい配列にプッシュします。それ以外の場合は、そうしないようにしています。まだ間違っているtrue(と評価されます...配列内にオブジェクトが見つかりません

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

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

問題は、オブジェクトuserだ場合でも、それは、friendsOnTripでのその式であるようにということです)だから私はthis._friendsNotOnTripの中にあるはずのオブジェクトで終わる。

オブジェクトの一例:friendsOnTripallUsers

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

位置0における物体及び位置0におけるオブジェクトは、同じオブジェクトです。私は、個々の属性を調べ、以下の結果得た:

friendsの内側に探し
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 

usersToSeeLocation、およびallUsers[0]friendsOnTrip[0]の両方でlocationを、内容は全く同じですので、私はそれらの式がに評価している理由としてわかりませんよfalse

+1

彼らは」あなたのcomparitionを行うために)(array2.join ===です同じオブジェクトではない。彼らは同じ情報を保持していますが、彼らはまだメモリ内の別の空間を持つ異種のオブジェクトです。 –

+1

[JavaScriptでのオブジェクト比較]の可能な複製(0120-17753) – sabithpocker

+0

「オブジェクト」の両方に同じキーと値がありますか?もしそうなら、あなたは** JSON.stringify **の両方のオブジェクトを試してから比較することができます。両方のオブジェクトが同じキーを持っていても値が異なる場合、 'return' falseでなければなりません。 –

答えて

3

このようなオブジェクトは比較できません。たとえば、

[{a: 1, b:2}].indexOf({a: 1, b:2}) 

は-1を返します。代わりに、「[0]、内容は全く同じですので、私はわからないよ[0]内の友人、usersToSeeLocation、両方ALLUSERS内の場所を見て、friendsOnTrip、特定のプロパティーの

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

おそらく、電子メール。 –

+0

これを連結して複数のプロパティの文字列を作成することもできます – fafl

+0

これはうまくいきました、ありがとうございます!私は '.map()'の使用について完全に忘れていました。 – wmash

0

のようなものを検索する必要がありますなぜそれらの表現が偽に評価されているのか」

これらは同じではないためです。同じ値を持っていても、同じオブジェクトではありません!あなたの「===」偽 は)あなたは(あなたがarray1.joinを行うことができますすべてのインデックスを一

ずつを比較する必要が返す理由は速く

関連する問題