【问题标题】:JS includes for an array of objects contains an object always return false [duplicate]JS包含一个对象数组包含一个对象总是返回false [重复]
【发布时间】:2018-09-04 08:57:34
【问题描述】:

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

我不明白,为什么是这样工作的。如何使检查工作是否正常? P>

【问题讨论】:

  • 如果你想这样做,你需要编写一个方法来按属性比较对象。

标签: javascript


【解决方案1】:

那是因为对象只等于它们自己,也只等于它们自己。*

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

而

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

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

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

【讨论】:

  • 我真的不想将 OP 与差异混为一谈,无论如何,对于对象来说都是一样的。 (如果他们问的是 NaN,那将是一个不同的答案)
  • 我明白了。我刚刚提供了该链接,因为.includes 文档使用了看起来评估并且它在那里是明确的。 :)
【解决方案2】:

这不起作用,因为你创建了两个不同的对象,它们不一样。

在这种情况下它会返回 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 因此,在您的情况下,您应该遍历数组并尝试将您的对象与元素进行比较

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我明白了。那么如何进行检查呢?
    • @Heidel 答案here 解释了如何比较这些对象。
    【解决方案4】:

    您可以使用some 方法测试数组中的至少一个元素是否通过测试。

    这个 sn-p 只测试 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)

    【讨论】:

      【解决方案5】:

      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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2020-11-29
          • 2018-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-17
          • 2011-10-28
          • 1970-01-01
          相关资源
          最近更新 更多