数组元素没有拼接成单独的数组 - FreeCodeCamp>矮胖的猴子

时间:2016-10-23 22:19:11

标签: javascript arrays algorithm

我正在解决FreeCodeCamp的挑战,并且我坚持下面的一个:

  

我们对此算法的目标是将arr(第一个参数)拆分为   较小的数组块,长度由大小提供(第二个   参数)。我们的代码需要几个绿色检查(目标)   传递以完成此算法:

     

([' a',' b',' c',' d'],2)预计会返回[[ ' a',' b'],[' c'' d']]

     

([0,1,2,3,4,5],3)预计会返回[[0,1,2],[3,4,5]]

     

([0,1,2,3,4,5],2)预计会返回[[0,1],[2,3],[4,5]]

     

([0,1,2,3,4,5],4)预计会返回[[0,1,2,3],[4,5]]

     

([0,1,2,3,4,5,6,7,8],2)预计会返回[[0,1],[2,3],   [4,5],[6,7],[8]]。

以下是我提出的代码:

function chunkArrayInGroups(arr, size) {

  var newArray = [];
  var holdArray = [];
  for (var i = 0; i <= arr.length; i += size) {
    holdArray = arr.slice(0, size);
    removed = arr.splice(0, size);
    newArray.push(holdArray);
  }
  if (arr.length !== 0) {
    newArray.push(arr);
    return newArray;
  }
  else return newArray; 
}

chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2);

该算法适用于所有目标,但最后一个目标除外。而不是返回:

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

它回来了:

[[0,1],[2,3],[4,5],[6,7,8]] - 我无法解释原因。

任何有助于解决我出错的地方的帮助都会非常感激!

2 个答案:

答案 0 :(得分:0)

我不会因为困惑而责备你,我花了一段时间才发现问题。

首先确定您的for循环有点奇怪 - 您没有使用i变量进行任何操作。另外,你在每次迭代时都是splice() - 原始数组,所以你的意图是正确的 - 等到数组中剩下少于size个元素。

所以我表示这是一个while循环,而且瞧,它的确有效:

function chunkArrayInGroups(arr, size) {

  var newArray = [];
  var holdArray = [];
  while (arr.length >= size) {
    holdArray = arr.slice(0, size);
    removed = arr.splice(0, size);
    newArray.push(holdArray);
  }
  if (arr.length !== 0) {
    newArray.push(arr);
    return newArray;
  }
  else return newArray; 
}

chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2);

答案 1 :(得分:0)

你一次又一次地重新计算长度,但是你忘了你实际上是从arr中删除元素,所以长度不会与大小增加长度减少相同,要么你可以给出while循环或者保持原始长度在变量中并检查

function chunkArrayInGroups(arr,size){

  var newArray = [];
  var holdArray = [];
  var length=arr.length;
  for (var i = 0; i <=length; i += size) {
    holdArray = arr.slice(0, size);
    removed = arr.splice(0, size);
    newArray.push(holdArray);
  }
  if (arr.length !== 0) {
    newArray.push(arr);
    return newArray;
  }
  else return newArray; 
}

chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6, 7, 8], 2);