在练习理解数组以及如何遍历数组时,我编写了一个函数,将每一行,每一列和两个对角线映射到它们自己的键值对中。
是否有更有效的方法来遍历此?我知道使用两个for循环是不好的做法,因为如果网格大于3x3,则会导致较高的复杂性。
let board = [
[1,2,3],
[4,5,6],
[7,8,9]
];
const mapper = board => {
let
map = {},
d1 = [],
d2 = [];
for (let i = 0; i < board.length; i++) {
let tmp = [];
// get all rows
map[`R${i}`] = board[i];
// get second diagonals
d2.push(board[i][board.length-1-i]);
for (let j = 0; j < board.length; j++) {
// get all columns
tmp.push(board[j][i]);
// get first diagonals
if (i === j) {
d1.push(board[i][j])
}
}
map[`C${i}`] = tmp;
}
map[`D1`] = d1;
map[`D2`] = d2;
return map;
}
console.log(mapper(board));
答案 0 :(得分:1)
下面的内容可以说很清晰,可以通过使用reduce进一步完善。
board = [
[1,2,3],
[4,5,6],
[7,8,9]
];
diag = 0; map = {}
board.forEach((row,r,arr) => {
var rows = arr.length-1;
map['R'+r] = row;
map['D'+1] = map['D'+1] || [];
map['D'+2] = map['D'+2] || [];
map['D'+1][diag] = row[diag];
map['D'+2][rows-diag] = row[rows-diag]
diag++;
row.forEach((col,c) => {
map['C'+c] = map['C'+c] || [];
map['C'+c].push(col);
});
});
console.log(map);