如何从三个数组创建指定嵌套结构对象?现有代码运行异常
构建指定结构的嵌套对象
现有数据
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 } ) ) })
问题分析与解决方案
你的代码存在两个核心问题:
- 遍历
data3[i]时,每次都会直接覆盖result[d.key]为新对象,最终每个data1的键下只剩最后一个键值对。 - 错误使用
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
相关产品推荐
相关产品推荐

