Я изучаю Javascript и в настоящее время столкнулся со следующей проблемой. Мне нужно получить каждый отдельный блок 3x3 2d-массива 9x9 в виде строки, разделенной запятыми. Я имею в виду, например, ...

2
TheObands 7 Июл 2021 в 23:09

4 ответа

Лучший ответ

Вы можете использовать два цикла, чтобы перебирать позиции всех возможных верхних левых углов, и еще два цикла, чтобы получить все элементы в этом квадрате.

var arr = [
  [5, 3, 5, 6, 7, 8, 9, 1, 2],
  [6, 7, 1, 1, 9, 5, 3, 4, 8],
  [1, 9, 2, 3, 4, 2, 5, 6, 7],
  [8, 5, 9, 7, 6, 1, 4, 2, 3],
  [4, 2, 6, 5, 5, 3, 7, 9, 1],
  [7, 1, 3, 1, 2, 4, 8, 5, 6],
  [9, 6, 1, 5, 3, 7, 2, 8, 4],
  [2, 8, 7, 5, 1, 9, 6, 3, 5],
  [3, 4, 5, 6, 8, 6, 1, 7, 9]
];
let res = [];
for (let i = 0; i < 9; i += 3) {
  for (let j = 0; j < 9; j += 3) {
    let curr = "";
    for (let k = 0; k < 3; k++) {
      for (let l = 0; l < 3; l++) {
        curr += arr[i + k][j + l];
      }
    }
    res.push(curr);
  }
}
console.log(res);
1
Unmitigated 7 Июл 2021 в 20:16

Вот довольно простой вложенный reduce(), который возвращает массив матриц указанного размера. Он касается каждого элемента один раз и использует координаты в переданной матрице, чтобы определить, в какую подматрицу и строку подматрицы нужно накапливать.

const
  matrix = [
    [5, 3, 5, 6, 7, 8, 9, 1, 2],
    [6, 7, 1, 1, 9, 5, 3, 4, 8],
    [1, 9, 2, 3, 4, 2, 5, 6, 7],
    [8, 5, 9, 7, 6, 1, 4, 2, 3],
    [4, 2, 6, 5, 5, 3, 7, 9, 1],
    [7, 1, 3, 1, 2, 4, 8, 5, 6],
    [9, 6, 1, 5, 3, 7, 2, 8, 4],
    [2, 8, 7, 5, 1, 9, 6, 3, 5],
    [3, 4, 5, 6, 8, 6, 1, 7, 9]],

  subdivide = (matrix, width, height) => {
    return matrix.reduce((acc, row, i) => {

      row.reduce((_acc, x, j, row) => {
        const grid = Math.floor(j / width) + Math.floor(i / height) * (Math.ceil(row.length / width));
        const gridRow = i % height;
        _acc[grid] ??= [];
        (_acc[grid][gridRow] ??= []).push(x);

        return _acc;
      }, acc)

      return acc;
    }, [])
  },

  subdividedmatrix = subdivide(matrix, 3, 3);

// log submatrices
subdividedmatrix.forEach(m => console.log(JSON.stringify(m)));

// map to strings
console.log(subdividedmatrix.map(submatrix => submatrix.flat().join('')))
.as-console-wrapper { max-height: 100% !important; top: 0; }
0
pilchard 7 Июл 2021 в 23:40

Вы тоже должны попробовать это.

var arr = [
  [5, 3, 5, 6, 7, 8, 9, 1, 2],
  [6, 7, 1, 1, 9, 5, 3, 4, 8],
  [1, 9, 2, 3, 4, 2, 5, 6, 7],
  [8, 5, 9, 7, 6, 1, 4, 2, 3],
  [4, 2, 6, 5, 5, 3, 7, 9, 1],
  [7, 1, 3, 1, 2, 4, 8, 5, 6],
  [9, 6, 1, 5, 3, 7, 2, 8, 4],
  [2, 8, 7, 5, 1, 9, 6, 3, 5],
  [3, 4, 5, 6, 8, 6, 1, 7, 9]
];
let res = [];
let i = 0,j = 0;
let justOneStr = "";
while(i < 9 && j < 9){
  justOneStr += arr[i][j];
  if(i % 3 == 2 && j % 3 == 2){
    res.push(justOneStr); 
    justOneStr="";
  }
  
  if((j % 9 == 8 || j % 3 == 2) && i % 3 != 2){
    j -= 3;
    i += 1;
  }
  else if(j % 9 == 8 && i % 3 == 2){
    j -= 9;
    i += 1;
  }
  else if(i % 3 == 2 && j % 3 == 2){
    i -= 2;
  }

  j++;
}

console.log(res);
0
NAO 7 Июл 2021 в 21:39

Проблема также может быть решена с помощью циклов, но рекомендуется решать ее с помощью функции Array.map () .

let arrayRow = "";
  const resultArray = Array2d.map((element, index) => {
     return arrayRow + element.map((element, i) => {
  return element.toString();
  });
});
0
Muhammad Ali 7 Июл 2021 в 20:45