正在做一些JS的初级算法练习。我不明白 "分块 "到了 "if "语句后是如何工作的。
我的主要困惑是在迭代到第2个值之后;因为在第一次运行时,它符合last是未定义的标准;所以 "1 "推入了分块变量。那么一旦第二个变量进来,2,由于现在last已经被定义了,而Last的长度不等于 "len "参数,所以会进入到else部分。2会被推到 "last "中,会形成last ="[1],2"?
然后,当第三个值(3),开始进来的时候,这时我就更糊涂了。if语句的chunked.push([number])怎么知道在此时number也是3的时候,准确地将[1],2推入chunked呢?是不是省略了3?我知道该点的最后一个长度满足len,但如何从[1],2制定到chunk[1,2]?
我假设3也会被推到 "last "中。
如果这听起来也很混乱,我真的很抱歉!我看了很多教程。我在网上看了很多关于解决这个同样问题的教程,但没有一处详细解释。
function chunkedArr(arr, len){
const chunked = [];
for (let number of arr){
const last = chunked[chunked.length-1]
console.log(last)
if(!last || last.length === len){
chunked.push( [number]);
} else {
last.push(number)
}
}
return chunked;
}
console.log(chunkedArr([1,2,3,4,5,6],2))
一个关键的见解可能是 chunked
是一个数组。
在本例中,在第二次迭代时。chunked
不会 [1]
但 [[1]]
. 请注意,它是一个数组的数组。那么 last
内唯一的子数组被分配给 chunked
即 [1]
,而在 else
块,值2将被追加到该子数组中,所以它变成了 [1, 2]
. 因为 last
真的 是 中的子数组。chunked
, chunked
现在看起来是这样的。[[1, 2]]
.
在下一次迭代中,值是3,而在下一次迭代中的 if
条件为真,因为现在 last
是 [1, 2]
,因此具有所需的长度为2.此时的值为 last
保持不变。这个子数组现在是 "满的"。A 新的 子数组被附加到 chunked
因此,它看起来像 [[1, 2], [3]]
在下一次迭代时,该值为4,现在是 last
将被分配给较新的子数组,即。[3]
. 然后继续...
让我们来看看你的算法。分块数组被调用,有两个参数。[1,2,3,4,5,6]
和len是 2
这就是所需的块的大小。在你的函数中,一个空数组 chunked
被定义。现在函数在数组 arr
.
!last
条件为真,因此。[1]
被推到chunked里面。现在chunked的形状如下。[ [1] ]
.[1]
. !last
是假的,并且 last.length === len
也是假的,因为len是2,所以,2被推入last。last的形状是 [1, 2]
而分块的形状是 [ [1, 2] ]
.[1, 2,]
. if中的条件为真,因为 last.length === len
. 所以,一个当前值为3的数组被推送到chunked中。现在chunked的大小是2,形状是 [ [1, 2], [3] ]
. [3]
. 如果evaluation为false,4就会被推到last里。Last的大小为2,形状为 [3, 4]
. 分块数组的大小为2,形状为 [ [1, 2], [3, 4] ]
.[ [1, 2], [3, 4], [5] ]
.[ [1, 2], [3,4], [5,6] ]
这时,由于没有更多的条目,所以对数组的迭代终止,函数返回chunked,当打印时,其形状与步骤6中的chunked相同。函数简单地走过输入数组,然后复制到一个新的数组,条件是新数组中的条目都是尺寸为 len
价值从 arr
连续服用。