@Alex10214

Как двумерный массив порезать на куски и превратить строки в столбцы?

Есть такой массив:

const t = [
  ['1Y', '3Y', '5Y', 'Since inception'],
  ['2.3', '36.57', '27.56', '24.36'],
  ['41.56', '-3.01', '2.24', '-6.12'],
  ['-11.28', '-18.78', '-18.78', '-22.7'],
  ['-8.99', '-57.64', '-57.64', '-89.62'],
  ['17.48', '23.41', '19.9', '20.83'],
  ['19.96', '24.25', '21.25', '23.72'],
  ['0.13', '1.56', '1.39', '1.17'],
  ['2.08', '-0.12', '0.11', '-0.26'],
  ];

Из него надо сделать такой массив:

const res = [
  [
    ['1Y', '2.3', '41.56'],
    ['3Y', '36.57', '-3.01'],
    ['5Y', '27.56', '2.24'],
    ['Since inception', '24.36', '-6.12'],
  ],
  [
    ['1Y', '-11.28', '-8.99'],
    ['3Y', '-18.78', '-57.64'],
    ['5Y', '-18.78', '-57.64'],
    ['Since inception', '-22.7', '-89.62'],
  ],
  [
    ['1Y', '17.48', '19.96'],
    ['3Y', '23.41', '24.25'],
    ['5Y', '19.9', '21.25'],
    ['Since inception', '20.83', '23.72'],
  ],
  [
    ['1Y', '0.13', '2.08'],
    ['3Y', '1.56', '-0.12'],
    ['5Y', '1.39', '0.11'],
    ['Since inception', '1.17', '-0.26'],
  ]
]

У меня получается только через циклы for в for и в for и дальше я просто уже теряюсь... А хотелось бы увидеть, как должно быть, чтоб изучить логику и понять как нужно.
  • Вопрос задан
  • 258 просмотров
Решения вопроса 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const result = [];
for (let i = 1; i < t.length; i += 2) {
  const sub = [];
  for (j = 0; j < t[0].length; j += 1) {
    sub.push([t[0][j], t[i][j], t[i + 1][j]]);
  }
  result.push(sub);
}
console.log(result);
Ответ написан
WblCHA
@WblCHA
Просто как вариант:
const columns = t[0];
  
  const result = t.reduce((acc, row1, i, arr) => {
    if(!(i & 1)) {
      return acc;
    }
    
    const row2 = arr[i + 1];
    const block = columns.map((c, j) => [c, row1[j], row2[j]]);
    
    acc.push(block);
    return acc;
  }, []);
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
const chunkedAndTransposed = ([ headers, ...arr ], chunkSize) =>
  arr.reduce((acc, n, i) => (
    (i % chunkSize) || acc.push(headers.map(m => [ m ])),
    n.forEach((m, j) => acc.at(-1)[j].push(m)),
    acc
  ), []);


const result = chunkedAndTransposed(arr, 2);

или, если на последний кусок данных не хватает, а размеры вложенных массивов должны быть одинаковыми, можно добавить null'ов или чего-нибудь ещё:

const chunkedAndTransposed = (arr, chunkSize, defautlValue = null) =>
  Array.from({ length: Math.ceil((arr.length - 1) / chunkSize) }, (_, iChunk) =>
    Array.from({ length: arr[0].length }, (_, iCol) =>
      Array.from({ length: chunkSize + 1 }, (_, iRow) =>
        iRow ? arr[iChunk * chunkSize + iRow]?.[iCol] ?? defautlValue : arr[0][iCol]
      )
    )
  );


const result = chunkedAndTransposed(arr, 5);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы