如何实现完全递归函数检查嵌套对象中是否存在指定值?
全递归检查嵌套对象中是否存在指定值的ES6+实现
你提供的函数属于“半递归”,存在明显缺陷:当遍历到第一个嵌套对象时就直接递归返回,若该递归调用返回false,函数会终止后续遍历,导致目标值在其他同级属性中时无法被检测到。
修正后的全递归实现
function contains(obj, value) { // 先检查当前值是否就是目标值 if (obj === value) return true; // 仅处理非null的对象/数组类型(typeof null 也会返回'object',需排除) if (typeof obj === 'object' && obj !== null) { // 遍历对象的所有值,递归检查每个值 for (const val of Object.values(obj)) { if (contains(val, value)) { return true; } } } // 未找到目标值 return false; }
更简洁的ES6+写法(使用Array.some)
const contains = (obj, value) => { if (obj === value) return true; return typeof obj === 'object' && obj !== null ? Object.values(obj).some(item => contains(item, value)) : false; };
原函数的问题分析
原函数在遍历到第一个属性是对象时,直接执行return contains(obj[key], value),这会终止当前循环,不再检查后续的属性。比如下面的例子,原函数会返回false,但实际上目标值'test'存在:
const testObj = { a: { b: 1 }, c: 'test' }; // 原函数调用contains(testObj, 'test')会返回false,因为先遍历到a属性,递归检查{a:1}没找到,直接返回false,忽略了c属性
内容的提问来源于stack exchange,提问作者Dvir Rozenblat
相关产品推荐
相关产品推荐

