如何快速检测三级嵌套多维对象中是否存在指定值?
针对你这种固定三级深度的对象检测需求,最快的方式肯定是利用短路求值,避免不必要的遍历——毕竟我们明确知道要找的是第三层的值,不用搞通用的深遍历(那会有额外函数调用开销)。
给你几个高效的实现方式,性能上差别不大,看你喜欢哪种风格:
1. 最直观的短路循环(性能最优,可控性强)
直接遍历第一层的所有二级对象,对每个二级对象取第三层的值数组,一旦找到目标值就立刻返回true,不用继续遍历剩下的元素:
function hasThirdLevelTarget(obj, targetValue) { // 遍历所有二级对象 for (const secondLayer of Object.values(obj)) { // 先确保二级是对象(避免非对象类型报错) if (typeof secondLayer !== 'object' || secondLayer === null) continue; // 取第三层的所有值,检查是否包含目标 if (Object.values(secondLayer).includes(targetValue)) { return true; // 找到就立刻返回,终止循环 } } return false; // 遍历完都没找到 } // 调用示例 const hasRed = hasThirdLevelTarget(myObj, 'red');
2. 更简洁的Array.some写法(代码更短,性能接近)
Array.some()本身就是短路的——只要有一个元素满足条件就停止遍历,和上面的循环性能几乎一致,写法更简洁:
const hasRed = Object.values(myObj).some(secondLayer => typeof secondLayer === 'object' && secondLayer !== null && Object.values(secondLayer).includes('red') );
为什么这比你原来的方法快?
你之前的逐层循环如果是遍历所有元素才返回,那会做很多无用功;而上面的方法都是找到目标就立刻终止遍历,平均情况下能节省大量时间。另外,includes比indexOf > -1的可读性更好,性能两者几乎没有差别。
边界情况处理
如果你的二级对象里可能存在非对象类型(比如数组、null或者原始值),一定要加上typeof secondLayer === 'object' && secondLayer !== null的判断,避免调用Object.values()时出错。
内容的提问来源于stack exchange,提问作者senty
相关产品推荐
相关产品推荐

