分块算法帮助 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

  1. 第一次迭代; last 是未定义的,因为 chunked 是空的。 !last 条件为真,因此,[1] 被推入分块。现在分块具有以下形状:[ [1] ].
  2. 现在最后一个是长度为 1 的数组,形状如下:[1]!last 是假的,last.length === len 也是假的,因为 len 是 2。所以,2 被推到最后。 last的形状是[1, 2],chunked的形状是[ [1, 2] ].
  3. 最后一个现在是大小为 2 且形状为 [1, 2,] 的数组。自 last.length === len 以来,if 中的条件计算结果为真。因此,当前值为 3 的数组被推入分块。 chunked 的大小现在是 2,形状是 [ [1, 2], [3] ]
  4. 最后一个已定义并且是一个大小为 1 且形状为 [3] 的数组。如果评估为 false,则将 4 推入最后。 Last 现在尺寸为 2,形状为 [3, 4]。分块数组的大小为 2,形状为 [ [1, 2], [3, 4] ].
  5. 现在当前值为 5,最后一个是大小为 2 的数组。如果条件为真,则将值为 5 的数组推入分块。 Chunked 的大小为 3,形状为 [ [1, 2], [3, 4], [5] ].
  6. 最后一个是大小为 1 的数组,其中的值为 6。如果为 false 等,则将 6 推到最后。 Last 的大小为 2,形状为 [5, 6],chunked 的形状为 [ [1, 2], [3,4], [5,6] ]

此时对数组的迭代终止,因为没有更多的条目和函数 returns chunked 打印时,其形状与步骤 6 中的 chunked 相同。函数简单地遍历输入数组并复制到一个新数组,条件是新数组的条目都是大小为 len 的数组,其中值来自 arr 连续获取。