Array.includes()在数组

时间:2018-07-30 23:16:02

标签: javascript

我正在尝试使用Array.prototype.includes在数组中查找对象。这可能吗?我意识到浅层比较和深层比较之间是有区别的。这是下面的代码返回false的原因吗?

dev tools console

如果这个问题被否决或标记为重复,我不会感到惊讶,但是我找不到Array.includes()的相关答案。如果答案在其他地方,我将删除。谢谢。

6 个答案:

答案 0 :(得分:5)

Array.includesobj === obj2一样按对象标识进行比较,因此可悲的是,除非它们是对同一个对象的引用,否则此方法不起作用。您通常可以使用带有功能的Array.prototype.some()来代替:

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

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

答案 1 :(得分:2)

是因为两个对象都不相同。两者都存储在内存中的不同位置,并且相等运算结果false

但是,如果您搜索相同的对象,则它将返回true

enter image description here

还要看一下下面的代码,您可以了解两个相同的对象也可以通过false运算符得出===

要使两个对象在true中返回===,它们应该指向相同的内存位置。

enter image description here

答案 2 :(得分:2)

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

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

要实现您想要的目标,您必须像上面一样添加实际的引用,或者遍历数组并按对象的唯一属性进行比较。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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