JavaScript对象能否直接深度嵌套?如何自动创建父对象?
在JavaScript中自动创建对象嵌套层级的方法
JavaScript本身没有内置的直接实现自动创建嵌套对象父层级的语法,但可以通过自定义工具函数或ES6 Proxy特性来实现更简洁的代码,避免手动逐层检查和创建。
方法一:自定义工具函数
编写一个通用函数,接收目标对象、嵌套路径和要赋值的值,自动创建不存在的中间层级:
function setNestedProperty(obj, path, value) { const keys = path.split('.'); let current = obj; // 遍历路径的前n-1个键,创建不存在的层级 for (let i = 0; i < keys.length - 1; i++) { const key = keys[i]; // 仅当当前键不存在或不是对象时创建空对象,保留已有数据 if (!current[key] || typeof current[key] !== 'object') { current[key] = {}; } current = current[key]; } // 赋值最终层级 current[keys[keys.length - 1]] = value; } // 使用示例 let testObject = {}; setNestedProperty(testObject, 'parent.child.grandchild', { foo: 'ya' }); console.log(testObject.parent.child.grandchild); // { foo: 'ya' }
这个函数会自动处理中间层级的存在性检查,无需手动编写多个if判断。
方法二:使用ES6 Proxy
通过Proxy拦截对象属性的访问操作,在访问不存在的层级时自动创建嵌套对象:
function createAutoNestedObject() { return new Proxy({}, { get(target, property) { // 如果属性不存在,创建新的嵌套Proxy对象 if (!(property in target)) { target[property] = createAutoNestedObject(); } return target[property]; } }); } // 使用示例 let testObject = createAutoNestedObject(); testObject.parent.child.grandchild = { foo: 'ya' }; console.log(testObject.parent.child.grandchild); // { foo: 'ya' }
这种方式更接近"自动创建"的直观写法,无需额外调用工具函数,直接赋值即可。
额外选项:使用工具库
如果项目中已经引入了Lodash这类工具库,可以直接使用_.set方法实现相同效果:
// 假设已引入Lodash let testObject = {}; _.set(testObject, 'parent.child.grandchild', { foo: 'ya' });
内容的提问来源于stack exchange,提问作者PatrickReagan
相关产品推荐
相关产品推荐

