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

JavaScript如何不修改原对象、不占额外空间修改嵌套对象值?

原代码问题

  • 仅递归遍历了嵌套对象,没有对非对象类型的属性执行赋值为'true'的逻辑
  • 参数propName未被使用,无法实现仅修改指定顶层属性下内容的需求

方案1:原地修改整个对象所有嵌套值为'true'

不需要传第二个参数,直接遍历所有层级的属性,非对象值直接赋值为'true',嵌套对象继续递归,全程不创建新对象、不占用额外空间:

function changeBoolean(obj) {
  for (let key in obj) {
    // 仅处理对象自身属性,跳过原型链继承属性
    if (!obj.hasOwnProperty(key)) continue
    if (typeof obj[key] === 'object' && obj[key] !== null) {
      // 嵌套对象递归处理
      changeBoolean(obj[key])
    } else {
      // 非对象值直接赋值为'true'
      obj[key] = 'true'
    }
  }
  return obj
}

// 调用示例:修改整个config对象
console.log(changeBoolean(config))

方案2:仅修改指定顶层属性下的所有嵌套值为'true'

保留第二个propName参数,只处理指定顶层属性下的内容:

function changeBoolean(obj, propName) {
  // 校验指定顶层属性是否存在、格式是否合法
  if (!obj.hasOwnProperty(propName) || typeof obj[propName] !== 'object' || obj[propName] === null) {
    return obj
  }
  // 递归处理指定属性下的内容
  function traverse(subObj) {
    for (let key in subObj) {
      if (!subObj.hasOwnProperty(key)) continue
      if (typeof subObj[key] === 'object' && subObj[key] !== null) {
        traverse(subObj[key])
      } else {
        subObj[key] = 'true'
      }
    }
  }
  traverse(obj[propName])
  return obj
}

// 调用示例:仅修改header下的所有值为'true'
console.log(changeBoolean(config, 'header'))

内容的提问来源于stack exchange,提问作者Akhil Raghav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:36:02