如何将二维扁平数组转换为带行列标识的网格单元格对象?
二维数组转嵌套单元格对象数组解决方案
需求回顾
原始输入二维数组:
[ ['column1', 'column2', 'column3', 'column4', 'column5'], ['2column1', '2column2', '2column3', '2column4', '2column5'] ]
期望输出格式(嵌套单元格对象数组):
[ [ { col: 'a', row: 1, cell_value: 'column1'}, { col: 'b', row: 1, cell_value: 'column2'}, { col: 'c', row: 1, cell_value: 'column3'}, { col: 'd', row: 1, cell_value: 'column4'}, { col: 'e', row: 1, cell_value: 'column5'} ], [ { col: 'a', row: 2, cell_value: '2column1'}, { col: 'b', row: 2, cell_value: '2column2'}, { col: 'c', row: 2, cell_value: '2column3'}, { col: 'd', row: 2, cell_value: '2column4'}, { col: 'e', row: 2, cell_value: '2column5'} ] ]
已实现的列字母转换函数:
export const columnToLetter = (column) => { let temp, letter = ''; while (column > 0) { temp = (column - 1) % 26; letter = String.fromCharCode(temp + 65) + letter; column = (column - temp - 1) / 26; } return letter; }
错误原因分析
你写的转换代码存在两个关键问题:
- 外层
map的回调函数里,while循环第一次执行就调用了return singleCell,直接终止了循环和回调,导致每一行只返回单个单元格对象,而非整行的对象数组。 - 循环条件
columnCount <= payload.formatted_values.length错误,应该遍历当前行的列数(即rowValues.length),而非整个二维数组的行数。
正确转换代码
const data = payload.formatted_values.map((rowValues, rowIndex) => { // 遍历当前行的每个单元格,生成对应对象 return rowValues.map((cellValue, colIndex) => { return { col: columnToLetter(colIndex + 1).toLowerCase(), // 转小写匹配目标格式 row: rowIndex + 1, cell_value: cellValue }; }); });
代码说明
- 外层
map遍历二维数组的每一行,rowIndex + 1对应行号(从1开始计数)。 - 内层
map遍历当前行的每个单元格,colIndex + 1传入columnToLetter生成列字母,再通过toLowerCase()转为小写,匹配目标格式中的a、b等标识。 - 每一行都会返回一个完整的单元格对象数组,最终得到符合要求的嵌套结构。
内容的提问来源于stack exchange,提问作者Udders
相关产品推荐
相关产品推荐

