JS Как из n-мерного массива сделать двумерный?

Подскажите, пожалуйста как из n-мерного массива сделать двумерный. Приведу пример

let bigArr = [
  [
    [ 'Ячейка 1-1' ],
    [ 'Ячейка 1-2' ],
    [ 'Ячейка 1-3' ],
  ],
  [
    [ 'Ячейка 2-1' ],
    [ 'Ячейка 2-2' ],
    [ 'Ячейка 2-3' ],
  ],
  [
    [ 'Ячейка 3-1' ],
    [ 'Ячейка 3-2' ],
    [ 'Ячейка 3-3' ],
  ],
];


let bigArr2 = [
  [
[ 'Ячейка 1-1' ],
[ 'Ячейка 1-2' ],
[ 'Ячейка 1-3' ],
  ],
  [
[ 'Ячейка 2-1' ],

[ 'Ячейка 2-3' ],
  ],
  [
[ 'Ячейка 3-1' ],
[ 'Ячейка 3-2' ],
[ 'Ячейка 3-3' ],
  ],
];






let resultArr = [];
/*
[
  [ 'Ячейка 1-1', 'Ячейка 2-1', 'Ячейка 3-1'],
  [ 'Ячейка 1-2', 'Ячейка 2-2', 'Ячейка 3-2'],
  [ 'Ячейка 1-3', 'Ячейка 2-3', 'Ячейка 3-3'],
];
*/

/* For second variant for bigArr2
[
  [ 'Ячейка 1-1', 'Ячейка 2-1', 'Ячейка 3-1'],
  [ 'Ячейка 1-2', 'empty', 'Ячейка 3-2'],
  [ 'Ячейка 1-3', 'Ячейка 2-3', 'Ячейка 3-3'],
];
*/

Есть n-мерный массив, в котором 2-х уровней может быть очень много. Как его трансформировать в массив 2-го порядка ? resultArr


Ответы (1 шт):

Автор решения: Grundy

Для удаления вложенности можно воспользоваться методом .flat.

Для получения ожидаемого результата, итоговую матрицу можно просто транспонировать, а именно поменять местами элементы A(i,j) и A(j,i)

Сделать это можно с помощью метода .map

let bigArr = [
  [
    ['Ячейка 1-1'],
    ['Ячейка 1-2'],
    ['Ячейка 1-3'],
  ],
  [
    ['Ячейка 2-1'],
    ['Ячейка 2-2'],
    ['Ячейка 2-3'],
  ],
  [
    ['Ячейка 3-1'],
    ['Ячейка 3-2'],
    ['Ячейка 3-3'],
  ],
];


let resultArr = bigArr.map(a => a.flat()).map((r, i, a) => r.map((c, j) => a[j][i]));

console.log(resultArr);
/*
[
  [ 'Ячейка 1-1', 'Ячейка 2-1', 'Ячейка 3-1'],
  [ 'Ячейка 1-2', 'Ячейка 2-2', 'Ячейка 3-2'],
  [ 'Ячейка 1-3', 'Ячейка 2-3', 'Ячейка 3-3'],
];
*/

В случае не квадратной матрицы, транспонирование стоит вынести в отдельную функцию

let bigArr = [
  [
    ['Ячейка 1-1'],
    ['Ячейка 1-2'],
    ['Ячейка 1-3'],
  ],
  [
    ['Ячейка 2-1'],
    ['Ячейка 2-2'],
    ['Ячейка 2-3'],
  ]
];

function transponse(m) {
  var result = [];
  for (var i = 0; i < m.length; i++) {
    for (var j = 0; j < m[i].length; j++) {
      if (!result[j]) result[j] = [];
      result[j][i] = m[i][j];
    }
  }
  return result;
}


let resultArr = bigArr.map(a => a.flat());
console.log(transponse(resultArr));
/*
[
  [ 'Ячейка 1-1', 'Ячейка 2-1'],
  [ 'Ячейка 1-2', 'Ячейка 2-2'],
  [ 'Ячейка 1-3', 'Ячейка 2-3'],
];
*/

→ Ссылка