矩阵转置核心是行列索引互换,JS中常用map+map实现:用matrix[0].map遍历列数,内层matrix.map取每行对应列元素;也可用reduce按列收集;不规则矩阵需取最大行长并补null。

用数组遍历方法实现矩阵转置,核心是把原矩阵的“行索引”和“列索引”互换:原矩阵第 i 行第 j 列的元素,变成新矩阵第 j 行第 i 列的元素。JS 中推荐用 map 配合 map(即双层映射),简洁且函数式风格清晰。
用 map + map 实现(最常用)
假设原矩阵是二维数组 matrix,且为非空、规则矩阵(每行长度一致):
const transpose = (matrix) => {
if (!matrix.length || !matrix[0].length) return [];
return matrix[0].map((_, colIndex) =>
matrix.map(row => row[colIndex])
);
};
说明:
- 外层
matrix[0].map遍历的是“列数”——因为转置后行数 = 原列数;_占位符表示不关心当前列值,只用colIndex; - 内层
matrix.map遍历所有行,每次取第colIndex列的元素,组成新行; - 例如
[[1,2],[3,4],[5,6]]→[[1,3,5],[2,4,6]]。
用 reduce 实现(适合理解遍历逻辑)
用 reduce 手动构建转置后的每一列作为一行:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
const transpose = (matrix) => {
if (!matrix.length || !matrix[0].length) return [];
return matrix.reduce((acc, row, i) => {
row.forEach((val, j) => {
if (!acc[j]) acc[j] = [];
acc[j].push(val);
});
return acc;
}, []);
};
说明:
-
acc是结果数组,初始为空数组; - 对每行
row和每个元素val,按其列下标j归入acc[j]; - 本质是“按列收集”,自然形成转置结构。
处理不规则矩阵(健壮性增强)
如果输入可能有空行或长度不一,可加默认值或跳过空项:
const transpose = (matrix) => {
if (!matrix.length) return [];
const maxLen = Math.max(...matrix.map(r => r.length));
return Array.from({ length: maxLen }, (_, j) =>
matrix.map(row => row[j] !== undefined ? row[j] : null)
);
};
说明:
- 用
Array.from显式创建目标行数(以最长行为准); - 对每一列
j,遍历所有行,缺失位置填null(也可用undefined或跳过); - 避免因某行太短导致
undefined报错或截断。
注意边界情况
以下情况需提前判断,否则会出错或返回意外结果:
- 空矩阵:
[]→ 返回[]; - 单行矩阵:
[[1,2,3]]→ 转置为[[1],[2],[3]]; - 单列矩阵:
[[1],[2],[3]]→ 转置为[[1,2,3]]; - 含空行:
[[], [1,2]],建议先过滤或补全再转置。

















