0

I'm trying to divide an array into subarrays base on the length of the given size, I almost got it but the result has some issue.

[Array(2), empty, Array(2)] // I don't know why there's an empty field in array?
0: (2) [1, 2]
2: (2) [3, 4]

function chunks(array, size) {
  var chunk = new Array(size);

  for (let i = 0; i < array.length; i += size) {
    chunk[i] = array.slice(i, i + size);
  }

  return chunk;
}

console.log(chunks([1, 2, 3, 4], 2))

The output should be:

[[ 1, 2], [3, 4]]
adiga
  • 34,372
  • 9
  • 61
  • 83
user-9725874
  • 831
  • 9
  • 15

4 Answers4

0

You're skipping indices by using i += size (in your case, 2 comes after 0 so element at index 1 remains undefined), use an array literal [] and push:

function chunks(array, size) {
  var chunk = [];
  
  for (let i = 0; i < array.length; i += size) {
    chunk.push(array.slice(i, i + size));
  }
  
  return chunk;
}

console.log(chunks([1, 2, 3, 4], 2))

Or, use an additional index for the new array:

function chunks(array, size) {
  var chunk = [];
  
  for (let i = 0, j = 0; i < array.length; i += size, j++) {
    chunk[j] = array.slice(i, i + size);
  }
  
  return chunk;
}

console.log(chunks([1, 2, 3, 4], 2))
DjaouadNM
  • 22,013
  • 4
  • 33
  • 55
0

function chunks(array, size) {

  var chunk = new Array(Math.floor(array.length / size));
  var counter = -1;

  for (let i = 0; i < array.length; i += size) {

    chunk[++counter] = array.slice(i, i + size);
  }

  return chunk;
}

console.log(chunks([1, 2, 3, 4], 2))

when you skipped size with loop var i array index also skipped

joyBlanks
  • 6,419
  • 1
  • 22
  • 47
0

function chunks(array, size) {

  var chunk = new Array(size);
  var index = 0;  // current index where we are going to insert value
  for (let i = 0; i <array.length; i+=size) {

    chunk[index] = array.slice(i,i+size);
    index++;
    // or you can do chunk.push(array.slice(i,i+size)); in one line
  }

  return chunk;
}

console.log(chunks([1, 2, 3, 4], 2))
shubham jha
  • 1,410
  • 12
  • 19
0
function chunks(array, size) {
  if (!array.length || !parseInt(size)) {
    return array;
  }
  const isNeedOneMore = array.length % size > 0 ? 1 : 0;
  let chunksLength = (parseInt(array.length / size) + isNeedOneMore);
  let chunks = [];
  while (chunksLength > 0) {
    let chunk = [];
    let s = size;
    while (s > 0 && array.length > 0) {
      chunk.push(array.shift());
      s--;
    }
    chunks.push(chunk);
    chunksLength--;
  }
  return chunks;
}

console.log(chunks([1, 2, 3, 4], 2));
Anton Marinenko
  • 2,749
  • 1
  • 10
  • 16