尽管数据在数组中找不到,但它仍未找到

时间:2017-01-24 12:32:50

标签: javascript arrays

我有2个对象数组(allUsersfriendsOnTrip)。这两个阵列都具有相同的格式。其中的每个对象都包含用户的详细信息(即firstNamelastName)。我试图让一个数组中的对象不在另一个数组中,然后将该对象推送到一个新数组,否则不要。

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中的usersToSeeLocationlocationallUsers[0],内容完全相同,所以我不确定为什么这些表达式正在评估friendsOnTrip[0]

2 个答案:

答案 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()来更快地做你的比赛