Search code examples
javascriptarraysarray-splice

Base Algorithm Scripting by chopping the array with splice function in Javascript


Now I am working on a exercise in freecodecamp. Currently I got an logical error but do not why the failure happens.

In the code,I have to build in a function, which chop the input array based on the parameter. The testing result should be as follows:

chunkArrayInGroups(["a", "b", "c", "d"], 2) should return [["a", "b"], ["c", "d"]].
chunkArrayInGroups([0, 1, 2, 3, 4, 5], 3) should return [[0, 1, 2], [3, 4, 5]].
chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 4) should return [[0, 1, 2, 3], [4, 5, 6, 7], [8]].
chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2) should return [[0, 1], [2, 3], [4, 5], [6, 7], [8]].

And my code are as follows:

function chunkArrayInGroups(arr, size) {
  var array = [];
  for (var x = 0; x < arr.length ; x+=size){
    var spliceArr = arr.splice(0,size);
    array.push(spliceArr);
  }
  array.push(arr);
  return array;
}

chunkArrayInGroups(["a", "b", "c", "d","e"], 2);

For most of the conditions, the code works. But for the last condition i.e

chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2) should return [[0, 1], [2, 3], [4, 5], [6, 7], [8]].

in this case I cannot get the correct answer. I tested in console log, and turn out the output is like

[[0, 1], [2, 3], [4, 5], [6, 7, 8]].

I know that it is not a difficult question and there are lots of better way to approach it, but can I know what is the logic fallancy in this code? Many thanks!


Solution

  • It might help to add a console.log(arr) to your loop to see how the array changes over time.

    You would see that it looks like this:

    [0, 1, 2, 3, 4, 5, 6, 7, 8]
    [2, 3, 4, 5, 6, 7, 8]
    [4, 5, 6, 7, 8]
    

    Then, take into account your final splice and add which occurs outside of the loop:

    [6, 7, 8]
    

    Since your loop increments by size, it will exit once it has gathered all subarrays of exactly size.

    Instead, I would recommend continuing until your input is empty:

    function chunkArrayInGroups(arr, size) {
      var array = [];
      while(arr.length > 0){
        var spliceArr = arr.splice(0,size);
        array.push(spliceArr);
      }
      return array;
    }