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

如何从三个数组创建指定嵌套结构对象?现有代码运行异常

构建指定结构的嵌套对象

现有数据

let data1 = [ {key: 'value1'}, {key: 'value2'}, {key:'value3'} ]
let data2 = [ {key: 'valueA'}, {key: 'valueB'}, {key:'valueC'}, {key: 'valueD'} ] // 结构相同,值不同
let data3 = [ [1,1,1,1], [1,1,1,1], [1,1,1,1] ]

期望的嵌套对象结构

result = {
  data1[0].key: {
    data2[0].key: data3[0][0],
    data2[1].key: data3[0][1],
    data2[2].key: data3[0][2],
    data2[3].key: data3[0][3]
  },
  data1[1].key: {
    data2[0].key: data3[1][0],
    data2[1].key: data3[1][1],
    data2[2].key: data3[1][2],
    data2[3].key: data3[1][3]
  },
  data1[2].key: {
    data2[0].key: data3[2][0],
    data2[1].key: data3[2][1],
    data2[2].key: data3[2][2],
    data2[3].key: data3[2][3]
  }
}

注:原示例中重复键会被覆盖,此处修正为对应data2的不同键值对,匹配data3对应位置元素。

尝试的代码(无法正常运行)

let result = {};
data1.map( (d, i) => {
     data3[i].map(
       (x,idx) => (
        result[d.key] = {
          data2[i]['key'] : x
         }
       )
      ) 
})

问题分析与解决方案

你的代码存在两个核心问题:

  1. 遍历data3[i]时,每次都会直接覆盖result[d.key]为新对象,最终每个data1的键下只剩最后一个键值对。
  2. 错误使用data2[i]['key'],应通过idx匹配data2的对应元素,而非固定用i。

修正后的代码如下:

let result = {};

data1.forEach((d1, i) => {
  // 为当前data1的键创建空内层对象,避免循环中被覆盖
  const innerObj = {};
  // 遍历data3的当前子数组,对应匹配data2的元素
  data3[i].forEach((val, idx) => {
    // 用data2对应位置的key值作为键,data3的元素作为值
    innerObj[data2[idx].key] = val;
  });
  // 将内层对象赋值给result的对应键
  result[d1.key] = innerObj;
});

代码说明

  • 用forEach替代map(仅需遍历处理,无需返回新数组)。
  • 提前创建内层对象,避免循环中被重复覆盖。
  • 通过idx关联data2和data3的对应位置,确保键值对一一匹配。

运行上述代码即可得到你期望的嵌套对象结构。


内容的提问来源于stack exchange,提问作者Bigboss01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:05:17