【问题标题】:Object not found within array even though it is在数组中找不到对象,即使它是
【发布时间】:2017-01-24 12:32:50
【问题描述】:

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

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

查看friendsallUsers[0]friendsOnTrip[0] 中的friendsusersToSeeLocationlocation,内容完全相同,所以我不确定为什么这些表达式的计算结果为false

【问题讨论】:

  • 它们不是同一个对象。它们拥有相同的信息,但它们仍然是具有不同内存空间的不同对象。
  • Objects 是否具有相同的键和值?如果是这样,那么您可以尝试使用 JSON.stringify 两个对象,然后进行比较。如果两个Objects 具有相同的键但具有不同的值,则它必须是return false。
  • 如何判断两个对象是否不同?哪些键只能识别一个对象和另一个对象?
  • @Ashish 不能保证键的顺序相同,所以 JSON.stringify 比较不稳定

标签: javascript arrays


【解决方案1】:

你不能像这样比较对象。例如

[{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);
    }
});

【讨论】:

  • 可能是电子邮件。
  • 你也可以通过连接多个属性来创建一个字符串
  • 这已经成功了,谢谢!我完全忘记了使用.map()
【解决方案2】:

“查看 allUsers[0] 和 friendsOnTrip[0] 中的朋友、usersToSeeLocation 和位置,内容完全相同,因此我不确定为什么这些表达式的计算结果为假。” em>

那是因为它们不一样。它们具有相同的值,但它们不是同一个对象!这就是为什么你的 "===" 返回 false 您必须一一比较所有索引

您可以执行 array1.join() === array2.join() 来更快地进行比较

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2016-06-09
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多