Array.includes() 在数组中查找对象
IT技术
javascript
arrays
object
2021-01-23 10:43:44
6个回答
Array.includes
像 一样按对象标识进行比较obj === obj2
,因此很遗憾,除非这两个项目是对同一对象的引用,否则这不起作用。你可以经常使用它Array.prototype.some()
来代替它接受一个函数:
const arr = [{a: 'b'}]
console.log(arr.some(item => item.a === 'b'))
但是当然,您需要编写一个小函数来定义相等的含义。
您在正确的轨道上,但问题是引用类型和值类型之间的区别,您当前使用的是引用类型(对象文字),因此当您将数组中的内容与您拥有的内容进行比较时,它将比较引用而不是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'));
其它你可能感兴趣的问题