我正在使用includes
检查对象数组是否包含对象,但它始终返回false
const record = {
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}
const selectedRows = [{
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}]
alert(selectedRows.includes(record));
我不明白为什么它会这样工作。如何使检查正常进行?
答案 0 :(得分:4)
那是因为对象仅等于他们自己,也只有他们自己。*
console.log({x: 1} === {x: 1}); // outputs false
而
const obj = {x: 1}
console.log(obj === obj); // outputs true.
该数组实际上并不包括record
,仅包括一个看起来像它的对象。
*限制诸如.valueOf()
和.toString()
等的奇数。
答案 1 :(得分:3)
这不起作用,因为您创建了两个不同的对象,它们不一样。
在这种情况下它将返回true
const record = {
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}
const selectedRows = [record]
alert(selectedRows.includes(record));
要检查两个对象的相等性,您可以阅读此问题的答案Object comparison in JavaScript 因此,在您的情况下,您应该遍历数组并尝试将您的对象与元素进行比较
答案 2 :(得分:2)
Javascript中的对象是引用类型。意思是当比较它们时,引擎不会一一比较它们的属性,而只是检查它们是否指向相同的内存地址。
在您的情况下,record
对象不是数组的一部分,因为在数组初始化期间,您使用对象初始化语法{...}
创建了一个单独的对象。相反,如果您使用[records]
创建数组,则会得到预期的结果:
const record = {
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}
const selectedRows = [record];
// Result: true
alert(selectedRows.includes(record));
另一种快速的检查方法是修改record
对象,然后将其与数组中的对象进行比较。您会注意到它们是不同的,这是因为这两个是两个不同的对象:
const record = {
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}
const selectedRows = [{
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}];
console.log("Modifying properties in record:");
record.id = "0";
record.key = "0";
console.log("Record: ", record);
console.log("Array content: ", selectedRows);
答案 3 :(得分:2)
您可以使用some方法来测试数组中至少一个元素是否通过测试。
此代码段仅测试id,但也可以包含多个字段
const record = {
id: "6c86e6c7-590a-44af-8492-1b83be1bf457",
key: "6c86e6c7-590a-44af-8492-1b83be1bf457",
number: 1,
priority: 0
}
const selectedRows = [{
id: "6c86e6c7-590a-44af-8492-1b83be1bf457",
key: "6c86e6c7-590a-44af-8492-1b83be1bf457",
number: 1,
priority: 0
}]
let x = selectedRows.some((item) => {
return record.id === item.id
})
console.log(x)
答案 4 :(得分:1)
const record = {
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}
const selectedRows = [{
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}]
//will alert the position of the element
//if -1 then element is not found
alert(selectedRows.findIndex(record => record.id === '6c86e6c7-590a-44af-8492-1b83be1bf457'));
您应检查元素的ID
答案 5 :(得分:1)
includes
不适用于两个不同的object
。您也许可以使用Array#some
做这样的事情:
const record = {
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}
const selectedRows = [{
id:"6c86e6c7-590a-44af-8492-1b83be1bf457",
key:"6c86e6c7-590a-44af-8492-1b83be1bf457",
number:1,
priority:0
}]
console.log(selectedRows.some(obj => JSON.stringify(obj) == JSON.stringify(record)));
或者,您可以使用Array.findIndex
获取数组中的object
索引。