在JavaScript中映射3x3网格

时间:2018-10-07 18:49:20

标签: javascript

在练习理解数组以及如何遍历数组时,我编写了一个函数,将每一行,每一列和两个对角线映射到它们自己的键值对中。

是否有更有效的方法来遍历此?我知道使用两个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));

1 个答案:

答案 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);