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

如何将含数组索引命名的对象属性合并为单个数组?

解决扁平对象转嵌套数组结构的问题

没问题,我来帮你把这个扁平的对象转换成嵌套数组的形式!你提到的match(/[^\[\]]+/g)确实是拆分键的关键一步,接下来我们只需要顺着拆分出来的路径,一步步构建嵌套结构就好。

实现思路

  1. 遍历原对象的每一个键值对;
  2. 用正则拆分键,得到路径片段(比如'Dolor[0][1]'会拆成['Dolor', '0', '1']);
  3. 顺着这些片段,逐层创建数组(如果不存在的话),最后把对应的值放到正确的位置上。

完整代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:12:13