Array.includes() 在数组中查找对象

IT技术 javascript arrays object
2021-01-23 10:43:44

我正在尝试使用Array.prototype.includes. 这可能吗?我意识到浅比较和深比较是有区别的。这是下面代码返回false的原因吗?我找不到相关的答案Array.includes()

开发工具控制台

6个回答

Array.includes像 一样按对象标识进行比较obj === obj2,因此很遗憾,除非这两个项目是对同一对象的引用,否则这不起作用。你可以经常使用它Array.prototype.some()来代替它接受一个函数:

const arr = [{a: 'b'}]
console.log(arr.some(item => item.a === 'b'))

但是当然,您需要编写一个小函数来定义相等的含义。

有趣的@iota。a === b在这种情况下,是否有任何示例 和相同值零相等性不同(可能是 NaN 除外)?
2021-03-18 10:43:44
如果我的对象像 {a: 'b',b:'c'},我应该如何比较以确保它是同一个对象?一些函数测试数组中是否至少有一个元素通过了测试......
2021-03-27 10:43:44
@probitaille,您需要一个以您想要的方式比较对象的函数,然后将其用于比较而不是==. 这里有选项:stackoverflow.com/questions/1068834/...
2021-03-30 10:43:44
Array#includes 实际上使用相同值零相等算法。
2021-03-30 10:43:44

它的'因为两个对象都不相同。两者都存储在内存中的不同位置以及相等运算的结果false

但是如果你搜索同一个对象,那么它会返回true.

在此处输入图片说明

另外,看看下面的代码,您可以在其中理解两个相同的对象也false===运算符产生。

对于返回truein 的两个对象===,它们应该指向相同的内存位置。

在此处输入图片说明

您在正确的轨道上,但问题是引用类型和值类型之间的区别,您当前使用的是引用类型(对象文字),因此当您将数组中的内容与您拥有的内容进行比较时,它将比较引用而不是value观。这就是我的意思:

    var ar = [];
    var x = {a: "b", c: "d" };
    ar.push(x);

    // this will log true because its the same reference
    console.log("should be true: ", ar[0] === x);

    ar.push({a: "b", c: "d" });
    // this will log false because i have created 
    // a different reference for a new object.
    console.log("should be false: ", ar[1] === x);
    
    // Think of it like this
    var obja = { foo: "bar" }; // new reference to 'obja'
    var objb = { foo: "bar" }; // new reference to 'objb'
    var valuea = 23;
    var valueb = 23;
    
    // 'obja' and 'obja' are different references
    // although they contain same property & value
    // so a test for equality will return false
    console.log("should be false: ", obja === objb);

    // on the other hand 'valuea' and 'valueb' are 
    // both value types, so an equality test will be true
    console.log("should be true: ", valuea === valueb);

要实现您想要的,您要么必须添加实际引用,就像我上面所做的那样,要么遍历数组并按对象的唯一属性进行比较。

这是因为includes检查对象是否在数组中,而实际上它不在:

> {a: 'b'} === {a: 'b'}
false

这是因为相等性的测试不是测试对象是否相同,而是测试是否指向同一个对象。他们没有。

您可以使用 find 返回此元素的值

const array = [{a: 'b'}];
array.includes(array.find(el=>el.a==='b'));