You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现完全递归函数检查嵌套对象中是否存在指定值?

全递归检查嵌套对象中是否存在指定值的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:35:03