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

如何基于键数组创建嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:53:55