如何将含数组索引命名的对象属性合并为单个数组?
解决扁平对象转嵌套数组结构的问题
没问题,我来帮你把这个扁平的对象转换成嵌套数组的形式!你提到的match(/[^\[\]]+/g)确实是拆分键的关键一步,接下来我们只需要顺着拆分出来的路径,一步步构建嵌套结构就好。
实现思路
- 遍历原对象的每一个键值对;
- 用正则拆分键,得到路径片段(比如
'Dolor[0][1]'会拆成['Dolor', '0', '1']); - 顺着这些片段,逐层创建数组(如果不存在的话),最后把对应的值放到正确的位置上。
完整代码实现
var obj = { 'Lorem': 'foo', 'Ipsum[0]': 'bar', 'Ipsum[1]': 'stuff', 'Dolor[0][0]': 'foo', 'Dolor[0][1]': 'bar', 'Dolor[1][0]': 'stuff', 'Dolor[1][1]': 'foo' }; function transformFlatObject(flatObj) { const result = {}; // 遍历原对象的所有键 for (const key in flatObj) { if (!flatObj.hasOwnProperty(key)) continue; // 拆分键为路径片段 const parts = key.match(/[^\[\]]+/g); const value = flatObj[key]; let current = result; // 遍历路径片段,除了最后一个(最后一个是索引或最终键) for (let i = 0; i < parts.length - 1; i++) { const part = parts[i]; // 如果当前位置不是数组,就初始化一个数组 if (!Array.isArray(current[part])) { current[part] = []; } // 移动到下一层 current = current[part]; } // 处理最后一个片段,把值放到对应的位置 const lastPart = parts[parts.length - 1]; current[lastPart] = value; } return result; } // 转换并输出结果 const transformedObj = transformFlatObject(obj); console.log(transformedObj);
代码解释
- 我们用
for...in遍历原对象的每个键,通过hasOwnProperty确保只处理对象自身的属性; parts = key.match(/[^\[\]]+/g)会把带括号的键拆分成纯文本片段,比如'Ipsum[0]'变成['Ipsum', '0'];- 用
current变量追踪当前构建的层级,从结果对象开始,一步步深入到数组的对应位置; - 最后把值赋值给最后一个片段对应的索引或键,完成嵌套结构的构建。
运行这段代码后,你就能得到想要的嵌套数组结构啦!
内容的提问来源于stack exchange,提问作者Nadroev
相关产品推荐
相关产品推荐

