分块算法帮助 JS
Chunking Algorithm Help JS
正在做一些 JS 初学者算法练习。当到达 "if" 语句时,我不理解 "chunking" 是如何工作的。
我的主要困惑是迭代到第二个值之后;因为在第一个运行中,它符合最后一个未定义的条件;所以“1”推入分块变量。因此,一旦第二个变量 2 出现,由于 last 现在已定义并且 Last 的长度不等于 "len" 参数,它将转到 else 部分。 2 将被推入 "last" 并形成 last = "[1],2"?
然后,当第三个值 (3) 开始出现时,这让我更加困惑。 if 语句的 chunked.push([number]) 如何知道在该点的数字也是 3 时将 [1],2 精确推入分块?是否省略了 3?我知道 last 在那个时候的长度满足 len 但它是如何从 [1],2 到块 [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
的值保持不变。这个子数组现在是 "full"。 new 子数组附加到 chunked
,因此它看起来像 [[1, 2], [3]]
在下一次迭代时,值为4,现在last
将被分配到较新的子数组,即[3]
。就这样继续......
让我们来看看你的算法。使用 2 个参数调用分块数组:[1,2,3,4,5,6]
并且 len 是 2
,这是所需的块大小。在您的函数内部,定义了一个空数组 chunked
。现在函数遍历数组 arr
。
- 第一次迭代; last 是未定义的,因为 chunked 是空的。
!last
条件为真,因此,[1]
被推入分块。现在分块具有以下形状:[ [1] ]
.
- 现在最后一个是长度为 1 的数组,形状如下:
[1]
。 !last
是假的,last.length === len
也是假的,因为 len 是 2。所以,2 被推到最后。 last的形状是[1, 2]
,chunked的形状是[ [1, 2] ]
.
- 最后一个现在是大小为 2 且形状为
[1, 2,]
的数组。自 last.length === len
以来,if 中的条件计算结果为真。因此,当前值为 3 的数组被推入分块。 chunked 的大小现在是 2,形状是 [ [1, 2], [3] ]
。
- 最后一个已定义并且是一个大小为 1 且形状为
[3]
的数组。如果评估为 false,则将 4 推入最后。 Last 现在尺寸为 2,形状为 [3, 4]
。分块数组的大小为 2,形状为 [ [1, 2], [3, 4] ]
.
- 现在当前值为 5,最后一个是大小为 2 的数组。如果条件为真,则将值为 5 的数组推入分块。 Chunked 的大小为 3,形状为
[ [1, 2], [3, 4], [5] ]
.
- 最后一个是大小为 1 的数组,其中的值为 6。如果为 false 等,则将 6 推到最后。 Last 的大小为 2,形状为 [5, 6],chunked 的形状为
[ [1, 2], [3,4], [5,6] ]
此时对数组的迭代终止,因为没有更多的条目和函数 returns chunked 打印时,其形状与步骤 6 中的 chunked 相同。函数简单地遍历输入数组并复制到一个新数组,条件是新数组的条目都是大小为 len
的数组,其中值来自 arr
连续获取。
正在做一些 JS 初学者算法练习。当到达 "if" 语句时,我不理解 "chunking" 是如何工作的。
我的主要困惑是迭代到第二个值之后;因为在第一个运行中,它符合最后一个未定义的条件;所以“1”推入分块变量。因此,一旦第二个变量 2 出现,由于 last 现在已定义并且 Last 的长度不等于 "len" 参数,它将转到 else 部分。 2 将被推入 "last" 并形成 last = "[1],2"?
然后,当第三个值 (3) 开始出现时,这让我更加困惑。 if 语句的 chunked.push([number]) 如何知道在该点的数字也是 3 时将 [1],2 精确推入分块?是否省略了 3?我知道 last 在那个时候的长度满足 len 但它是如何从 [1],2 到块 [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
的值保持不变。这个子数组现在是 "full"。 new 子数组附加到 chunked
,因此它看起来像 [[1, 2], [3]]
在下一次迭代时,值为4,现在last
将被分配到较新的子数组,即[3]
。就这样继续......
让我们来看看你的算法。使用 2 个参数调用分块数组:[1,2,3,4,5,6]
并且 len 是 2
,这是所需的块大小。在您的函数内部,定义了一个空数组 chunked
。现在函数遍历数组 arr
。
- 第一次迭代; last 是未定义的,因为 chunked 是空的。
!last
条件为真,因此,[1]
被推入分块。现在分块具有以下形状:[ [1] ]
. - 现在最后一个是长度为 1 的数组,形状如下:
[1]
。!last
是假的,last.length === len
也是假的,因为 len 是 2。所以,2 被推到最后。 last的形状是[1, 2]
,chunked的形状是[ [1, 2] ]
. - 最后一个现在是大小为 2 且形状为
[1, 2,]
的数组。自last.length === len
以来,if 中的条件计算结果为真。因此,当前值为 3 的数组被推入分块。 chunked 的大小现在是 2,形状是[ [1, 2], [3] ]
。 - 最后一个已定义并且是一个大小为 1 且形状为
[3]
的数组。如果评估为 false,则将 4 推入最后。 Last 现在尺寸为 2,形状为[3, 4]
。分块数组的大小为 2,形状为[ [1, 2], [3, 4] ]
. - 现在当前值为 5,最后一个是大小为 2 的数组。如果条件为真,则将值为 5 的数组推入分块。 Chunked 的大小为 3,形状为
[ [1, 2], [3, 4], [5] ]
. - 最后一个是大小为 1 的数组,其中的值为 6。如果为 false 等,则将 6 推到最后。 Last 的大小为 2,形状为 [5, 6],chunked 的形状为
[ [1, 2], [3,4], [5,6] ]
此时对数组的迭代终止,因为没有更多的条目和函数 returns chunked 打印时,其形状与步骤 6 中的 chunked 相同。函数简单地遍历输入数组并复制到一个新数组,条件是新数组的条目都是大小为 len
的数组,其中值来自 arr
连续获取。