我有2个对象数组(allUsers
和friendsOnTrip
)。这两个阵列都具有相同的格式。其中的每个对象都包含用户的详细信息(即firstName
和lastName
)。我试图让一个数组中的对象不在另一个数组中,然后将该对象推送到一个新数组,否则不要。
allUsers.forEach((user) => {
if (friendsOnTrip.indexOf(user) <= -1) {
this._friendsNotOnTrip.push(user);
}
});
问题是,即使对象user
看起来像<{1}}中那样,那么表达式为:
friendsOnTrip
...仍会评估为if (friendsOnTrip.indexOf(user) <= -1)
(这是错误的)所以我最终得到的true
内的对象不应该存在。
其中一个对象的示例:
this._friendsNotOnTrip
{
email: "foo@bar.com",
firstName: "foo",
lastName: "bar",
key: "123456789",
friends: [
"987654321",
"246808642"
],
location: {
lng: -1.24567,
lat: 50.9865
},
usersToSeeLocation: [
"987654321"
]
}
中位置0处的对象和allUsers
中位置0处的对象是相同对象。我测试了各个属性并得到了以下结果:
friendsOnTrip
查看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
和friends
中的usersToSeeLocation
,location
和allUsers[0]
,内容完全相同,所以我不确定为什么这些表达式正在评估friendsOnTrip[0]
。
答案 0 :(得分:3)
您无法比较此类对象。例如
[{a: 1, b:2}].indexOf({a: 1, b:2})
返回-1。相反,您应该搜索特定属性,例如
allUsers.forEach((user) => {
if (friendsOnTrip.map(u => u.key).indexOf(user.key) <= -1) {
this._friendsNotOnTrip.push(user);
}
});
答案 1 :(得分:0)
&#34;在allUsers [0]和friendsOnTrip [0]中查看朋友,usersToSeeLocation和位置,内容完全相同,所以我不确定为什么这些表达式评估为false。 &#34;
那是因为它们不一样。它们具有相同的价值,但它们不是同一个对象!这就是为什么你的&#34; ===&#34;返回false 您必须逐个比较所有索引你可以做array1.join()=== array2.join()来更快地做你的比赛