![](/img/trans.png)
[英]Array within object returning length of 0, even though there are elements present
[英]Object not found within array even though it is
我有2个对象数组( allUsers
和friendsOnTrip
)。 这两个数组的格式相同。 其中的每个对象都包含用户的详细信息(即firstName
和lastName
)。 我试图使一个数组中的一个对象不在另一个数组中,然后将该对象推到一个新的数组中,否则不要这样做。
allUsers.forEach((user) => {
if (friendsOnTrip.indexOf(user) <= -1) {
this._friendsNotOnTrip.push(user);
}
});
问题是,即使对象user
看起来像在friendsOnTrip
,也可以使用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"
]
}
allUsers
位于位置0的对象和friendsOnTrip
中位于位置0的对象是同一对象。 我测试了各个属性,并得到以下结果:
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
在allUsers[0]
和friendsOnTrip[0]
friends
, usersToSeeLocation
和location
中,内容完全相同,因此我不确定为什么这些表达式求值为false
。
您无法比较这样的对象。 例如
[{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);
}
});
“查看朋友,usersToSeeLocation和allUsers [0]和friendsOnTrip [0]中的位置,它们的内容是完全相同的,因此我不确定这些表达式为何被评估为false。”
那是因为它们不一样。 具有相同的值,但它们不是同一对象! 这就是为什么您的“ ===”返回false您必须一一比较所有索引
您可以执行array1.join()=== array2.join()以更快地进行比较
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.