Home > Enterprise >  Split a two-dimensional array of specified length
Split a two-dimensional array of specified length

Time:05-26

Split the original array into a two-dimensional array of the specified length

list => source array

columns => columns number

targetList => two-dimensional array

const list = [1,2,3,4,5,6,7,8,9,10]
const columns = 4;
const targetList = [ [1,2,3], [4,5,6], [7,8,9], [10] ];

const columns = 5;
const targetList = [ [1,2], [3,4], [5,6], [7,8], [9,10] ];

const columns = 6;
const targetList = [ [1,2], [3,4], [5,6], [7,8], [9], [10] ];
const list = [1,2,3,4,5,6]
const columns = 4;
const targetList = [ [1,2], [3,4], [5], [6] ];
const list = [1,2,3,4]
const columns = 5;
const targetList = [ [1], [2], [3], [4] ];

CodePudding user response:

You can use Array.prototype.reduce and approach the problem by using the following conditionals:

  1. If items remaining to be pushed becomes equal to rows remaining to be created, then start adding rows of of length 1.

  2. If there are no rows currently or the last row is filled i.e. no more columns can be added to the last row, then add a new row with the current item.

  3. And finally, if the last row still has room for more columns, then push the current item to the last row

const transform = (list, rows) =>
  list.reduce((t, l, i) => {
    if (list.length - i === rows - t.length) {
      t.push([l]);
    } else if (!t.length || t.at(-1).length >= Math.ceil(list.length / rows)) {
      t.push([l]);
    } else {
      t.at(-1).push(l);
    }
    return t;
  }, []);

console.log(transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 4));
console.log(transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5));
console.log(transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 6));
console.log(transform([1, 2, 3, 4, 5, 6], 4));
console.log(transform([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 4));
console.log(transform([1, 2, 3, 4], 5));

Other relevant documentations:

  • Related