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
相关产品推荐
相关产品推荐

