我正在尝试使用Array.prototype.includes
在数组中查找对象。这可能吗?我意识到浅层比较和深层比较之间是有区别的。这是下面的代码返回false的原因吗?
如果这个问题被否决或标记为重复,我不会感到惊讶,但是我找不到Array.includes()
的相关答案。如果答案在其他地方,我将删除。谢谢。
答案 0 :(得分:5)
Array.includes
像obj === obj2
一样按对象标识进行比较,因此可悲的是,除非它们是对同一个对象的引用,否则此方法不起作用。您通常可以使用带有功能的Array.prototype.some()
来代替:
const arr = [{a: 'b'}]
console.log(arr.some(item => item.a === 'b'))
但是,当然,您需要编写一个小的函数来定义相等性。
答案 1 :(得分:2)
是因为两个对象都不相同。两者都存储在内存中的不同位置,并且相等运算结果false
。
但是,如果您搜索相同的对象,则它将返回true
。
还要看一下下面的代码,您可以了解两个相同的对象也可以通过false
运算符得出===
。
要使两个对象在true
中返回===
,它们应该指向相同的内存位置。
答案 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'))