下划线的作用是什么?
map() 的第一个参数被命名为_ 的原因是它没有被使用。
下划线是 usually picked by convention 作为未使用参数的名称。
但我不明白为什么我们只作用于数组 a[0] 的第一个元素
使用a[0] 是任意的。由于矩阵中的所有行都具有相同的长度,因此任何索引都可以使用。我们这样做是为了获取列数。
基本上,第一个map() 迭代第一行(所有列),并且在每次迭代时,忽略当前列值并获取当前列索引。换句话说,第一个map() 从左到右遍历矩阵的“宽度”,每次都抓取当前列索引。
第二个map() 在第一个map() 内。这意味着它对于每个列索引,迭代所有行(矩阵的高度),并且在每次迭代时,使用相应的列索引从当前行创建一个新行。
- 需要注意的重要一点是
map 每次都会创建一个新数组,因此您正在创建一个新的转置矩阵,而不是以任何方式更改初始矩阵。
视觉示例
如果从矩阵开始:
[ ['a1', 'a2', 'a3'] ]
[ ['b1', 'b2', 'b3'] ]
然后在每一步中,发生的情况如下(对原始矩阵使用 M,对转置矩阵使用 T):
// Step1
columnIndex = 0
T[columnIndex][0] becomes M[0][columnIndex] which is "a1"
T[columnIndex][1] becomes M[1][columnIndex] which is "b1"
transposed row 0 becomes ["a1", "b1"]
// Step2
columnIndex = 1
T[columnIndex][0] becomes M[0][columnIndex] which is "a2"
T[columnIndex][1] becomes M[1][columnIndex] which is "b2"
transposed row 1 becomes ["a2", "b2"]
// Step3
columnIndex = 2
T[columnIndex][0] becomes M[0][columnIndex] which is "a3"
T[columnIndex][1] becomes M[1][columnIndex] which is "b3"
transposed row 2 becomes ["a3", "b3"]
你最终得到一个转置矩阵:
[ ['a1', 'b1'] ]
[ ['a2', 'b2'] ]
[ ['a3', 'b3'] ]
这里的代码更改了格式和变量名,以更清楚地显示正在发生的事情。打开控制台查看每个步骤中发生的情况。
var matrix = [];
matrix.push(['a1', 'a2', 'a3']); // first row
matrix.push(['b1', 'b2', 'b3']);
/*
matrix =
[ ['a1', 'a2', 'a3'] ]
[ ['b1', 'b2', 'b3'] ]
*/
function transpose(matrix) {
var firstRow = matrix[0];
var transposedMatrix = firstRow.map(function(UNUSED, columnIndex) {
console.debug('\ncolumnIndex = %d', columnIndex);
var transposedRow = matrix.map(function(row, idx) { // <-- idx is only used for logging, it's not necessary
console.debug('T[%d][%d] = becomes %o', columnIndex, idx, row[columnIndex]);
return row[columnIndex];
});
console.debug('transposed row %d becomes %o: ', columnIndex, transposedRow);
return transposedRow;
});
return transposedMatrix;
}
var transposed = transpose(matrix);
/*
transposed =
[ ['a1', 'b1'] ]
[ ['a2', 'b2'] ]
[ ['a3', 'b3'] ]
*/
console.dir(transposed);