Javascript 用于在数组中查找对象的Array.includes()

Javascript 用于在数组中查找对象的Array.includes(),javascript,arrays,object,Javascript,Arrays,Object,我正在尝试使用array.prototype.includes在数组中查找对象。这可能吗?我意识到肤浅的比较和深刻的比较是有区别的。这就是下面代码返回false的原因吗?我找不到有关Array.includes()的答案 数组。includes按对象标识进行比较,就像obj===obj2一样,因此遗憾的是,除非这两个项是对同一对象的引用,否则这不起作用。您可以经常使用以下函数: const arr=[{a:'b'}] log(arr.some(item=>item.a=='b'))Its',因

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


数组。includes
按对象标识进行比较,就像
obj===obj2
一样,因此遗憾的是,除非这两个项是对同一对象的引用,否则这不起作用。您可以经常使用以下函数:

const arr=[{a:'b'}]

log(arr.some(item=>item.a=='b'))
Its',因为这两个对象不相同。两者都存储在内存中的不同位置,相等运算结果
false

但是如果搜索同一个对象,它将返回
true

另外,看看下面的代码,您可以理解两个相同的对象也会使用
=
操作符生成
false

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


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

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

这是因为相等性测试不是测试对象是否相同,而是测试对象是否指向同一对象。但是,问题在于引用类型和值类型之间的差异,您当前使用的是引用类型(对象文字),因此当您将数组中的内容与现有内容进行比较时,它将比较引用而不是值。这就是我的意思:

var-ar=[];
变量x={a:b',c:d};
ar.push(x);
//这将记录为true,因为它是相同的引用
log(“应为true:,ar[0]==x);
ar.push({a:b,c:d});
//这将记录为false,因为我已创建
//新对象的不同引用。
log(“应为false:,ar[1]==x);
//这样想吧
var obja={foo:“bar”};//“obja”的新提法
var objb={foo:“bar”};//对“objb”的新引用
var值a=23;
var值b=23;
//“obja”和“obja”是不同的引用
//尽管它们包含相同的属性和值
//因此,相等性测试将返回false
log(“应为false:,obja==objb”);
//另一方面,“valuea”和“valueb”是
//这两种值类型,因此相等性测试将为真

log(“应为true:,valuea==valueb”)您可以使用find返回此元素的值

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

console.log(arr.some(item=>item.b==='c'))
因为
{a:'b'}=={a:'b'}
false
?是的,可以使用Array.prototype.includes在数组中查找对象,但它必须是完全相同的对象,而不是像屏幕截图所示的新创建的对象。这是有效的:
const a={};console.log([a]。包括(a))
。你能详细说明你的解决方案有什么不同,它与其他答案有什么不同,或者它如何更好。如果我的对象类似于{a:'b',b:'c',,我应该如何比较以确保它是同一个对象?有些函数测试数组中是否至少有一个元素通过了测试…@probitaille,您需要一个函数以您想要的方式比较对象,然后将其用于比较,而不是
==
。这里有这样的选项:
Array#includes
实际上使用相同的值零相等算法。有趣的@iota。在这种情况下,
a===b
和相同的值零相等是否存在差异(除了NaN)?