【发布时间】:2017-01-24 12:32:50
【问题描述】:
我有 2 个对象数组(allUsers 和 friendsOnTrip)。这两个数组的格式相同。其中的每个对象都包含用户的详细信息(即firstName 和lastName)。我试图让如果一个数组中的对象不在另一个数组中,则将该对象推送到一个新数组,否则不要。
allUsers.forEach((user) => {
if (friendsOnTrip.indexOf(user) <= -1) {
this._friendsNotOnTrip.push(user);
}
});
问题是即使对象user看起来像在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
查看friends 和allUsers[0] 和friendsOnTrip[0] 中的friends、usersToSeeLocation 和location,内容完全相同,所以我不确定为什么这些表达式的计算结果为false。
【问题讨论】:
-
它们不是同一个对象。它们拥有相同的信息,但它们仍然是具有不同内存空间的不同对象。
-
Objects是否具有相同的键和值?如果是这样,那么您可以尝试使用 JSON.stringify 两个对象,然后进行比较。如果两个Objects具有相同的键但具有不同的值,则它必须是returnfalse。 -
如何判断两个对象是否不同?哪些键只能识别一个对象和另一个对象?
-
@Ashish 不能保证键的顺序相同,所以 JSON.stringify 比较不稳定
标签: javascript arrays