将平面阵列转换为采用相同大小的块的2D阵列

时间:2015-12-02 12:20:28

标签: javascript arrays

我正在进行freecodecamp练习,需要帮助弄清楚为什么我的代码无法按预期工作。因此,本练习的目的是:

  

编写一个将数组(第一个参数)拆分成组的函数   大小的长度(第二个参数)并将它们作为a返回   多维数组。

为什么此代码不会返回[[0, 1], [2, 3], [4, 5]]



function chunk(arr, size) {
  // Break it up.
  var output = [];
  for (var x = 0; x < arr.length; x++) {
    if (arr.length >= size) {
      output.push(arr.splice([0], size));
    } else {
      output.push(arr.splice([0], arr.length));
    }
  }
  return output;
}
document.write(JSON.stringify(
  chunk([0, 1, 2, 3, 4, 5], 2)
));
&#13;
&#13;
&#13;

9 个答案:

答案 0 :(得分:1)

arr.splice也会修改arr。这样,在您的示例中,在第一次调用arr.splice(0, size)后(注意它不是[0]),arr只有4个元素,在第二次调用后,只剩下2个元素。因此x < arr.legnth比你想要的更早。

另一个问题是,您只需在每次迭代中将x增加1,它应该是size

总的来说,这应该有效

function chunk(arr, size) {
  // Break it up.
  var output = []; 
  var l = arr.length;
  for (var x = 0; x < l; x+=size) {                                                      
    if (arr.length >= size) {
      output.push(arr.splice(0, size));
    } else {
      output.push(arr.splice(0, arr.length));
    }   
  }
  return output;
}

console.log(chunk([0, 1, 2, 3, 4, 5], 2));

答案 1 :(得分:1)

((2) 1) 循环替换为更简单的for循环:

&#13;
&#13;
while
&#13;
&#13;
&#13;

答案 2 :(得分:1)

模数有另一种方式。

&#13;
&#13;
function chunk(arr, size) {
  for (var x = 0, l = arr.length, arrD = []; x < l; x++) {
    x % size === 0 ? arrD.push([arr[x]]) : arrD[arrD.length - 1].push(arr[x]);
  }
  return arrD;
}

var _ = chunk(["a", "b", "c", "d"], 2);

document.write(JSON.stringify(_));
&#13;
&#13;
&#13;

答案 3 :(得分:0)

试试这个:

function chunk(arr, size) {
  // Break it up.
  var output = [];
  var length = arr.length/size; // this is because each time you splice original array size reduces.
  for (var x = 0; x < length; x++) {
    if (arr.length > size) {
      output.push(arr.splice([0], size));
    } else {
      output.push(arr.splice([0], arr.length));
    }
  }
  return output;
}

console.log(chunk([0, 1, 2, 3, 4, 5], 2));

答案 4 :(得分:0)

您的函数无效,因为通过使用splice,您可以在迭代期间从数组中删除项目,但不会相应地更改循环变量(x)。

可能的解决方案是将for loop更改为while

function chunk(arr, size) {
  // Break it up.
  var output = [];
  while(arr.length > 0) {
    if (arr.length >= size) {
      output.push(arr.splice([0], size));
    } else {
      output.push(arr.splice([0], arr.length));
    }
  }
  return output;
}

答案 5 :(得分:0)

以这种方式尝试:

function chunk(arr, size) {
  // Break it up.
  var output = [];
  var yo = arr.length;
  for (var x = 0; x < yo; x++) {
    if (arr.length > size) {
      output.push(arr.splice([0], size));
    } else {
      output.push(arr);
      break;
    }
  }
  return output;
}

console.log(chunk([0, 1, 2, 3, 4, 5], 2));

问题是:

  1. 数组长度始终在变化,因为splice会修改数组本身。
  2. arr.length > size应该是条件。
  3. Fiddle

答案 6 :(得分:0)

另一种解决方案是:

function chunk(arr, size) {
  var i, temparray, finalarray = [];
  for (i=0; i<arr.length; i+=size) {
    temparray = arr.slice(i, i+size);
    finalarray.push(temparray);
  }

  return finalarray;
}

答案 7 :(得分:0)

问题

0 < arr.length删除数组中的元素。因此,您的数组将自动变得越来越小,直到不再剩余元素为止。

这意味着您的循环应该在x时停止,然后才会停止。这也意味着您可以完全删除function chunk(arr, size) { // Break it up. var output = []; for (; 0 < arr.length;) { if (arr.length >= size) { output.push(arr.splice(0, size)); } else { output.push(arr.splice(0, arr.length)); } } return output; } var data = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M']; document.body.innerHTML = '<pre>' + 'SIZE 3\n-------\n' + JSON.stringify(chunk(data, 3), null, 2) + '</pre>';变量。

演示:

splice

另一种方法

最好不要使用chunk,因为它会删除数组中的所有数据。这意味着你不能这样。执行chunk后,执行slice两次或对数组执行任何其他操作。

更好的方法是使用slice代替,它只是复制数组的一部分并使数组保持原样。

使用1,您可以使用经典的for循环,但增量不是size而是function chunk(arr, size) { var output = []; var length = arr.length; for (var x = 0, length = arr.length; x < length; x = x + size) { output.push(arr.slice([x], x + size)); } return output; } var data = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M']; document.body.innerHTML = '<pre>' + 'SIZE 2\n-------\n' + JSON.stringify(chunk(data, 2), null, 2) + "\n\n"+ 'SIZE 3\n-------\n' + JSON.stringify(chunk(data, 3), null, 2) + "\n\n"+ 'SIZE 4\n-------\n' + JSON.stringify(chunk(data, 4), null, 2) + "\n\n"+ 'SIZE 5\n-------\n' + JSON.stringify(chunk(data, 5), null, 2) + "\n\n"+ 'SIZE 6\n-------\n' + JSON.stringify(chunk(data, 6), null, 2) + "\n\n"+ 'SIZE 7\n-------\n' + JSON.stringify(chunk(data, 7), null, 2) + '</pre>';

演示:

{{1}}

答案 8 :(得分:0)

这是使用递归的“单行”:

function chunk(a, s) {
  return a.length ? [a.slice(0, s)].concat(chunk(a.slice(s), s)) : [];
}

document.write(JSON.stringify(
    chunk(["a", "b", "c", "d"], 2)
));