JavaScript如何将二维数组转换为指定结构的对象数组
原代码错误原因
你的代码输出不符合预期,是两个逻辑错误导致的:
- 嵌套遍历逻辑混乱:外层
map拿到的elem已经是原数组里的每一行子数组了,你又在elem上调用forEach,这时候回调里的e是子数组里的单个元素(比如字符串、数字),此时访问e[2]、e[3]只能拿到undefined,根本取不到你要的月份和年份值。 - 映射逻辑方向错了:
Array.map是一对一映射,遍历3行就会返回3个对象组成的数组,但你要的结果是把3行的数据聚合到同一个对象里,再把这个对象放到长度为1的数组中,不是生成3个独立对象。
最简实现方案
针对你给出的所有行x值(月份、年份)一致的场景,不需要复杂遍历,直接聚合数据即可:
let a = [ ["base-certificate", 60, 3, 2022], ["case-certificate", 1, 3, 2022], ["standard-certificate", 7, 3, 2022], ]; // 先初始化结果对象,x值所有行通用,直接取第一行的对应位即可 const target = { x: [a[0][2], a[0][3]] }; // 遍历每一行,提取属性名和对应值 a.forEach(([fullKey, value]) => { // 去掉key里的-certificate后缀,拿到base/case/standard这类短键名 const key = fullKey.replace('-certificate', ''); target[key] = value; }); // 最后把聚合好的对象包进数组,就是你要的结构 const result = [target]; console.log(result); // 输出 [{x: [3, 2022], base: 60, case: 1, standard: 7}]
如果后续你的数据里存在不同行对应不同年月的情况,只需要加一层判断,遇到新的年月值就新建对应的聚合对象即可,上面的写法在当前需求下性能最高、代码可读性也最好。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

