如何在对象数组中查找元素?使用Array.includes判断存在元素总返回false
问题原因
JavaScript中Array.prototype.includes()方法内部使用**严格相等(===)**进行值比较。对于对象这类引用类型数据,===比较的是对象在内存中的引用地址,而非对象内部的属性值。你代码里数组中存储的{x: "c", y: 3}和单独声明的elem是两个完全独立的对象,指向不同的内存地址,所以includes判断结果必然是false。
解决方案
你可以用以下几种常用方式实现对象数组的元素匹配:
1. 用Array.prototype.some()按属性匹配
这是最常用的方案,可自定义匹配规则判断对象属性是否符合要求:
const arr = [ {x: "a", y: 1}, {x: "b", y: 2}, {x: "c", y: 3} ]; const elem = {x: "c", y: 3}; // 匹配所有属性值相等 const isExist = arr.some(item => item.x === elem.x && item.y === elem.y); console.log(isExist); // 输出 true
如果对象属性较多,也可以把属性校验抽成通用逻辑:
function isObjectEqual(obj1, obj2) { // 先判断引用地址是否相同 if (obj1 === obj2) return true; // 判断两个对象的key数量是否一致 const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; // 遍历判断每个属性值是否相等(仅适用于属性值为基础类型的场景) return keys1.every(key => obj1[key] === obj2[key]); } const isExist = arr.some(item => isObjectEqual(item, elem));
2. 序列化后比较(简单场景适用)
如果对象结构简单,没有循环引用、函数、Symbol等特殊类型,也可以通过JSON.stringify()转为字符串后比较:
const isExist = arr.some(item => JSON.stringify(item) === JSON.stringify(elem));
注意:该方法对属性顺序敏感,如果两个对象属性顺序不同会导致判断错误,仅推荐明确对象结构固定的场景使用。
3. 直接存储对象引用
如果后续需要频繁判断该对象是否在数组中,也可以在创建时直接保存引用,就可以正常用includes判断了:
const elem = {x: "c", y: 3}; const arr = [ {x: "a", y: 1}, {x: "b", y: 2}, elem // 直接把elem存入数组,引用地址一致 ]; console.log(arr.includes(elem)); // 输出 true
内容的提问来源于stack exchange,提问作者NewDevUser
相关产品推荐
相关产品推荐

