Bagaimana cara memetakan array secara vertikal ke dalam kolom?


15

Jika saya memiliki berbagai item, seperti,

const array = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ]

Bagaimana saya bisa memetakannya, sehingga layar / halaman merender,

1     6     11    16
2     7     12    17
3     8     13    18
4     9     14
5     10    15

Saya bisa membuatnya bekerja secara horizontal dengan,

    const chunkSize = 5;

    array
      .map((e, i) => {
        return i % chunkSize === 0 ?
           selected.slice(i, i + chunkSize)
         : null;
      })
      .filter(e => e);

Tetapi saya tidak dapat membuatnya bekerja secara vertikal. Bagaimana saya bisa melakukan ini?

Edit:

Solusi yang disarankan dari jawaban lain mengembalikan subarrays, yang bukan yang saya tanyakan dalam pertanyaan ini.

Jawaban:


3

Ini versi yang masih ringkas namun mudah dibaca.

const columnize = (items, rows) => {
  const toColumns = (table, item, iteration) => {
    let row = iteration % rows;

    table[row] = table[row] || [];
    table[row].push(item);

    return table;
  };

  return items.reduce(toColumns, []);
};

Yang akan digunakan sebagai:

const numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ];

console.log(columnize(numbers, 5));

https://jsfiddle.net/69fshprq/

Berikut adalah cara untuk menampilkannya saat pertanyaan diajukan. Saya tidak memperhatikan spasi secara ketat, saya akan membiarkan fungsi string padding atau teknik untuk diterapkan.

const numbers = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ]

// <pre id="out"></pre>
let out = document.getElementById('out')
let list = columnize(numbers, 5)

for (var column in list) {
    var item = list[column]
    var line = item.reduce((line, item) => line + item + '    ', '')

    out.textContent += line + ' \n'
}

https://jsfiddle.net/t60rfcpe/


11

Anda dapat menghitung indeks untuk baris tersebut.

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
    chunk = 5,
    result = array.reduce((r, v, i) => {
        (r[i % chunk] = r[i % chunk] || []).push(v);
        return r;
    }, []);
    

result.forEach(a => console.log(...a));


sangat cepat. Butuh beberapa saat untuk menyedotnya, tetapi saya menemukan Anda lebih cepat ..
Wei

6

const array = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ]
const chunkSize = 5;

let result = [];
for (let i = 0; i < chunkSize; i++) {
    result[i] = [];
}

array.forEach((e,i) => {
    result[i % chunkSize].push(e);
});

console.log(result); 
/* 
Result : 
[ [ 1, 6, 11, 16 ],
  [ 2, 7, 12, 17 ],
  [ 3, 8, 13, 18 ],
  [ 4, 9, 14 ],
  [ 5, 10, 15 ] ]
*/


Anda tidak memerlukan for for loop. Saya menganggap Anda menggunakannya untuk mengatur kunci? Anda melakukan prinsip yang sama persis di forach, hanya sedikit lebih kompleks dengan modulus
Martijn
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.