【问题标题】:Array.includes() to find object in arrayArray.includes() 在数组中查找对象
【发布时间】:2019-01-07 06:20:33
【问题描述】:

我正在尝试使用Array.prototype.includes 在数组中查找对象。这可能吗?我意识到浅比较和深比较之间是有区别的。这是以下代码返回错误的原因吗?我找不到Array.includes() 的相关答案。

【问题讨论】:

  • 因为{a: 'b'} == {a: 'b'}false
  • 是的,您可以使用 Array.prototype.includes 在数组中查找对象,但它必须是完全相同的对象,而不是像您的屏幕截图所示的新创建的对象。这有效:const a = {}; console.log( [a].includes( a ) );.

标签: javascript arrays object


【解决方案1】:

你不能在对象上使用字符串比较,除非你首先将它们转换为字符串...

JSON.stringify(TheObject)

所以要遍历数组中的所有对象以防止添加重复对象,您可以使用类似这样的东西...

let Bad=false;

ObjectArray.forEach(function(e){if(JSON.stringify(NewObject)===JSON.stringify(e)){Bad=true;}});

if(Bad){alert('This object already exists!');} else {ObjectArray.push(NewObject);}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您能否详细说明您的解决方案有什么不同以及它与其他答案有何不同或更好。
    【解决方案3】:

    你可以使用 find 返回 this 元素的值

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 如果我的对象类似于 {a: 'b',b:'c'},我应该如何比较以确保它是同一个对象?某些函数测试数组中是否至少有一个元素通过了测试...
      • @probitaille,您需要一个以您想要的方式比较对象的函数,然后使用它而不是== 进行比较。这里有选项:stackoverflow.com/questions/1068834/…
      • Array#includes 实际上使用的是同值零相等算法。
      • 有趣的@iota。在这种情况下是否有任何 a === b 和相同值零相等性不同的示例(可能是 NaN 除外)?
      • 工作,非常感谢。
      【解决方案5】:

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

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

      另外,看看下面的代码,你可以理解两个相同的对象也会用=== 运算符生成false

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-15
            • 2018-08-13
            • 2017-04-15
            • 1970-01-01
            相关资源
            最近更新 更多