JS包含的对象数组包含的对象始终返回false

时间:2018-09-04 08:57:34

标签: javascript

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

我不明白为什么它会这样工作。如何使检查正常进行?

6 个答案:

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