我正在进行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;
答案 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
循环:
while
&#13;
答案 2 :(得分:1)
模数有另一种方式。
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;
答案 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));
问题是:
splice
会修改数组本身。arr.length > size
应该是条件。答案 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)
));