如何从点分隔的键字符串生成嵌套JSON结构?
按点分隔键生成嵌套JSON结构
核心思路
将点分隔的键字符串拆分为键数组,通过迭代方式逐层构建嵌套对象,最终把currValue存入最内层的value属性中。
实现方法
方法1:倒序循环构建(从内到外)
先创建最内层的{value: currValue},再逐层向外包裹新对象:
function buildNestedObject(keys, currValue) { const keyArray = keys.split('.'); let result = { value: currValue }; for (let i = keyArray.length - 1; i >= 0; i--) { result = { [keyArray[i]]: result }; } return result; } // 使用示例 const currValue = 1.2; const keys = 'global.fontsize.bodyscale'; const nestedObj = buildNestedObject(keys, currValue); console.log(JSON.stringify(nestedObj, null, 2));
方法2:用reduceRight简化代码
借助数组的reduceRight方法从末尾迭代,代码更简洁:
function buildNestedObject(keys, currValue) { return keys.split('.').reduceRight((acc, key) => { return { [key]: acc }; }, { value: currValue }); } // 使用示例 const currValue = 1.2; const keys = 'global.fontsize.bodyscale'; console.log(JSON.stringify(buildNestedObject(keys, currValue), null, 2));
方法3:正序循环构建(从外到内)
通过指针跟踪当前层级,从外层开始逐层创建嵌套结构:
function buildNestedObject(keys, currValue) { const keyArray = keys.split('.'); const result = {}; let currentLayer = result; // 遍历到倒数第二个键,逐层创建空对象 for (let i = 0; i < keyArray.length - 1; i++) { const key = keyArray[i]; currentLayer[key] = {}; currentLayer = currentLayer[key]; } // 为最后一个键添加包含value的对象 currentLayer[keyArray[keyArray.length - 1]] = { value: currValue }; return result; } // 使用示例 const currValue = 1.2; const keys = 'global.fontsize.bodyscale'; console.log(JSON.stringify(buildNestedObject(keys, currValue), null, 2));
注意事项
- 若
keys为空字符串,可添加边界处理(比如直接返回{value: currValue}) - 键包含特殊字符(如空格、符号)时,上述方法依然有效,因为用了ES6计算属性名语法
[key]
内容的提问来源于stack exchange,提问作者U. Watt
相关产品推荐
相关产品推荐

