JS包含的对象数组包含的对象总是返回false



我正在使用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));

我不明白为什么它以这种方式工作。如何使检查正常工作?

这是因为对象只等于它们自己,而且只等于它们自己。

console.log({x: 1} === {x: 1}); // outputs false

const obj = {x: 1}
console.log(obj === obj); // outputs true.

该数组实际上并不包括record,而只包含一个看起来像它的对象。

*除非像.valueOf().toString()等奇怪的东西。

它不起作用,因为您创建了两个不同的对象,它们并不相同。

在这种情况下,它将返回 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));

要检查两个对象的相等性,您可以阅读此问题的答案 JavaScript 中的对象比较 因此,在您的情况下,u 应该遍历数组并尝试将您的对象与元素进行比较

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);

您可以使用某种方法来测试数组中是否至少有一个元素通过了测试。

此代码段仅测试 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)

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

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索引。

最新更新