JavaScript中判断对象是否包含另一个对象的最优方法
判断容器对象中是否包含目标对象的最优方法
嘿,这个问题我之前踩过一模一样的坑!你用indexOf返回-1是因为JavaScript里对象是引用类型——哪怕两个对象的键值对完全一样,只要它们不是同一个内存引用,===严格相等就会返回false,而indexOf内部就是用===来做比较的,所以自然找不到匹配项。
那怎么正确判断呢?给你几个实用的方案,按需选择:
1. 直接属性比较(简单场景最优)
如果你的对象只有固定的几个属性(比如例子里的row和col),直接用Array.some()来做自定义比较是最直接高效的——它会遍历数组,找到第一个匹配项就立刻停止,性能拉满:
const obj = { 1: {row: 1, col: 1}, 2: {row: 2, col:2 } } const test = { row:1, col: 1 } // 检查是否存在 const isExists = Object.values(obj).some(item => item.row === test.row && item.col === test.col); console.log(isExists); // 输出 true
2. 找到具体对象/索引
如果你不光要知道“有没有”,还要拿到匹配的对象或者它的索引,就用find()或findIndex():
// 获取匹配的对象 const matchedItem = Object.values(obj).find(item => item.row === test.row && item.col === test.col); // 获取匹配对象的索引 const matchedIndex = Object.values(obj).findIndex(item => item.row === test.row && item.col === test.col);
3. 通用浅比较函数(属性较多时用)
如果对象属性多,不想一个个写比较条件,可以封装一个浅比较函数,适用于没有嵌套对象的场景:
function shallowEqual(a, b) { const keysA = Object.keys(a); const keysB = Object.keys(b); // 键的数量不一样直接返回false if (keysA.length !== keysB.length) return false; // 逐个比较键值对 return keysA.every(key => a[key] === b[key]); } // 用这个函数检查存在性 const isExists = Object.values(obj).some(item => shallowEqual(item, test));
要是对象里有嵌套的子对象,那就要用深比较了(可以自己写递归逻辑,或者用成熟工具库的深比较方法),不过大部分简单场景浅比较就够了。
总结一下:
- 仅判断存在:优先用
some(),短路遍历性能最好 - 需要获取对象:用
find() - 需要获取索引:用
findIndex()
内容的提问来源于stack exchange,提问作者kobebasketball
相关产品推荐
相关产品推荐

