JavaScript的.includes()方法在对象数组中无法正常工作的问题
判断数组是否包含指定内容对象的正确方法
这问题我太熟悉了!你遇到的情况是因为 includes() 方法的判断逻辑导致的——它用的是**严格相等(===)**来比较元素,而对象属于引用类型:你传入的 { name: "object1" } 和数组里的那个同名对象,是两个完全独立的内存引用,哪怕内容一模一样,=== 也会返回 false,所以 includes() 自然匹配不到。
正确的解决方式:用 Array.prototype.some()
some() 方法会遍历数组,只要有一个元素满足你定义的条件,就会返回 true,非常适合用来判断数组里是否存在内容匹配的对象。
1. 简单对象(单属性或少量属性)
直接在回调里比较对象的属性即可:
let list1 = [{ name: "object1" }, { name: "object2" }, { name: "object3" }, { name: "object4" } ] if (list1.some(item => item.name === "object1")) { document.write('contains') } else { document.write('doesnt') }
2. 复杂对象(多属性需要完全匹配)
可以写一个通用的对象比较函数,再结合 some() 使用:
// 自定义对象深度比较函数(基础版) function objectsAreEqual(objA, objB) { // 先判断是否是同一引用 if (objA === objB) return true; // 判断属性数量是否一致 const keysA = Object.keys(objA); const keysB = Object.keys(objB); if (keysA.length !== keysB.length) return false; // 逐个比较属性值 for (const key of keysA) { if (objA[key] !== objB[key]) return false; } return true; } // 使用示例 let list1 = [{ name: "object1", id: 1 }, { name: "object2", id: 2 }] const targetObj = { name: "object1", id: 1 } if (list1.some(item => objectsAreEqual(item, targetObj))) { document.write('contains') } else { document.write('doesnt') }
3. 快捷但有局限的方式:JSON.stringify()
如果你的对象是纯数据类型(没有函数、undefined、Symbol这类JSON无法处理的类型),且属性顺序固定,可以把对象转成字符串后比较:
let list1 = [{ name: "object1" }, { name: "object2" }] if (list1.some(item => JSON.stringify(item) === JSON.stringify({ name: "object1" }))) { document.write('contains') }
⚠️ 注意:这种方法有坑——如果对象属性顺序不同(比如{name: "a", age: 1}和{age:1, name:"a"}),转成字符串后会不一样,而且无法处理JSON不支持的类型,所以只适合简单场景。
内容的提问来源于stack exchange,提问作者Harvey Lewis
相关产品推荐
相关产品推荐

