如何基于键数组创建嵌套JSON?JS动态设置嵌套属性方法
嘿,这两个问题其实都是JavaScript里处理嵌套对象的常见需求,我来给你详细讲讲实现方法,都是实战中常用的技巧哦:
1. 基于键数组创建嵌套JSON
假设你有一个键数组(比如['user', 'profile', 'address']),想要生成对应的嵌套JSON结构,甚至给最内层的键赋值,用reduceRight方法是最简洁的思路——从最内层往外层反向构建,逻辑非常清晰:
function createNestedObject(keys, value = {}) { // reduceRight从数组最后一项开始遍历,逐步包裹成嵌套对象 return keys.reduceRight((acc, key) => { return { [key]: acc }; }, value); } // 示例使用:创建带值的嵌套结构 const keys = ['a', 'b', 'c']; const nestedObj = createNestedObject(keys, '你好'); console.log(nestedObj); // 输出: { a: { b: { c: '你好' } } } // 示例:创建空的嵌套结构 const emptyNestedObj = createNestedObject(['x', 'y', 'z']); console.log(emptyNestedObj); // 输出: { x: { y: { z: {} } } }
2. 基于Schema动态设置嵌套属性
如果给定了一个代表嵌套结构的Schema,要动态给指定的嵌套属性赋值,我们可以写一个通用的工具函数,支持数组路径或点分隔的字符串路径,自动创建不存在的中间层级:
function setNestedProperty(targetObj, path, value) { // 把路径统一转成数组格式(兼容字符串和数组两种输入) const keys = typeof path === 'string' ? path.split('.') : [...path]; // 遍历到倒数第二个键,找到要赋值的父对象 const parentObj = keys.slice(0, -1).reduce((current, key) => { // 如果当前层级不存在,自动创建空对象 if (!current[key]) { current[key] = {}; } return current[key]; }, targetObj); // 给最后一个键赋值 parentObj[keys.at(-1)] = value; return targetObj; } // 示例使用:基于数组路径赋值 const target = {}; setNestedProperty(target, ['user', 'profile', 'city'], '上海'); console.log(target); // 输出: { user: { profile: { city: '上海' } } } // 示例使用:基于点分隔的字符串路径赋值 setNestedProperty(target, 'user.profile.age', 26); console.log(target.user.profile.age); // 输出: 26
如果你的Schema是一个完整的结构模板(比如带默认值的空结构),可以先克隆Schema避免修改原模板,再批量填充数据:
function populateSchema(schema, dataMap) { // 深克隆Schema,防止污染原模板对象 const clonedSchema = JSON.parse(JSON.stringify(schema)); // 遍历数据映射表,批量设置嵌套属性 Object.entries(dataMap).forEach(([path, value]) => { setNestedProperty(clonedSchema, path, value); }); return clonedSchema; } // 示例使用 const userSchema = { user: { profile: { name: '', age: 0, address: { city: '', street: '' } } } }; const userData = { 'user.profile.name': '小明', 'user.profile.age': 25, 'user.profile.address.city': '北京' }; const populatedUser = populateSchema(userSchema, userData); console.log(populatedUser); // 输出: { user: { profile: { name: '小明', age: 25, address: { city: '北京', street: '' } } } }
内容的提问来源于stack exchange,提问作者Sudhir Shrestha
相关产品推荐
相关产品推荐

