Làm thế nào để ánh xạ một mảng theo chiều dọc vào các cột?


15

Nếu tôi có một loạt các mặt hàng, chẳng hạn như,

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

Làm cách nào tôi có thể ánh xạ nó, để màn hình / trang hiển thị,

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

Tôi đã có thể làm cho nó để loại công việc theo chiều ngang với,

    const chunkSize = 5;

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

Nhưng tôi không thể làm cho nó hoạt động theo chiều dọc. Tôi có thể làm cái này như thế nào?

Biên tập:

Giải pháp được đề xuất từ ​​một câu trả lời khác trả về các câu hỏi con, đó không phải là điều tôi đã hỏi trong câu hỏi này.

Câu trả lời:


3

Đây là một phiên bản nhỏ gọn nhưng dễ đọc.

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, []);
};

Mà sẽ được sử dụng như:

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/

Đây là một cách để xuất nó như các câu hỏi. Tôi không chú ý đến khoảng cách, tôi sẽ để điều đó cho một chức năng hoặc kỹ thuật đệm chuỗi để thực hiện.

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

Bạn có thể tính toán chỉ số cho hàng.

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


nhanh quá. Phải mất một thời gian để tôi yêu nó, nhưng tôi thấy bạn đã nhanh hơn ..
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 ] ]
*/


Bạn không cần vòng lặp for. Tôi giả sử bạn sử dụng nó để thiết lập các phím? Bạn đang thực hiện nguyên tắc chính xác tương tự trong forEach, chỉ phức tạp hơn một chút với mô-đun
Martijn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.