首先我要指出这段代码是有效的。那不是问题!我只是不明白到底是怎么回事。据我了解, chunked.push 方法一直在广告一个新数组。但显然,事实并非如此。它给出了正确的答案: [[ 1, 2], [3, 4], [5]]
我根本不明白这段代码中发生了什么。它吐出正确的答案,并在必要时在每个数组中放入几个项目,但代码每次都会创建一个新的子数组,不是吗?不,显然不是——但我不明白为什么不呢?请帮忙!
function chunk(array, size) {
let workArr = [...array];
let chunked = [];
for (let i = 0; i < workArr.length; i++) {
let last = chunked[chunked.length - 1];
if (!last || last.length === size) {
chunked.push([workArr[i]])
} else {
last.push(workArr[i]);
}
}
return chunked;
}
以下是一些输入参数和预期结果的示例:
// chunk([1, 2, 3, 4], 2) --> [[ 1, 2], [3, 4]]
// chunk([1, 2, 3, 4, 5], 2) --> [[ 1, 2], [3, 4], [5]]
// chunk([1, 2, 3, 4, 5, 6, 7, 8], 3) --> [[ 1, 2, 3], [4, 5, 6], [7, 8]]
// chunk([1, 2, 3, 4, 5], 4) --> [[ 1, 2, 3, 4], [5]]
// chunk([1, 2, 3, 4, 5], 10) --> [[ 1, 2, 3, 4, 5]]
最佳答案
让我们打破它
这复制了一个数组,其中使用了展开运算符
let workArr = [...array];
遍历 workArr
数组中的每一项
for (let i = 0; i < workArr.length; i++) {
}
我认为这会在第一次运行时给你 undefined
,因为 chunked
中的索引 -1
处没有任何内容(因为一开始, chunked.length
为 0
),但它会将 last
设置为 chunked
数组的最后一个元素
let last = chunked[chunked.length - 1];
如果 last
有假值 (0
, null
, undefined
, ""
, NaN
, false
) 或 last
的长度等于 size
(请注意, last
应该是数组或字符串),然后将 workArr
数组的第 i 个元素(从 0 开始索引)作为数组插入 chunked
数组,否则将其插入从 workArr
到 last
的元素,但是 last
应该是一个数组
if (!last || last.length === size) {
chunked.push([workArr[i]])
} else {
last.push(workArr[i]);
}
然后简单地返回chunked
数组
return chunked;
关于javascript - 我不明白这个解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57623542/