【问题标题】:Chunking Algorithm Help JS分块算法帮助 JS
【发布时间】:2020-05-06 17:01:08
【问题描述】:

在 JS 中进行一些初学者算法练习。我不明白“如果”语句中的“分块”是如何工作的。

我的主要困惑是在迭代到第二个值之后;因为在第一次运行中,它满足最后未定义的标准;所以“1”推入分块变量。因此,一旦第二个变量 2 出现,由于现在定义了 last 并且 Last 的长度不等于“len”参数,它将转到 else 部分。 2 将被推入“last”,它会形成 last =“[1],2”?

然后,当第三个值 (3) 开始出现时,这是我更加困惑的时候。 if 语句的 chunked.push([number]) 如何知道当 number 也是 3 时将 [1],2 准确推送到 chunked 中?是不是省略了3?我知道 last 的长度在这一点上遇到了 len 但它是如何从 [1],2 到块 [1,2] 的?

我假设 3 也会被推入“最后一个”。

如果这听起来也令人困惑,我深表歉意!我在网上看了很多关于解决同样问题的教程,但没有详细解释。

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))

【问题讨论】:

    标签: javascript arrays constants chunking


    【解决方案1】:

    一个关键的见解可能是chunked 是一个数组数组。

    在示例中,在第二次迭代中,chunked 将不是[1],而是[[1]]。请注意,它是一个数组的数组。那么last 被分配了chunked 内的唯一子数组,即[1],在else 块中,值2 被附加到该子数组,所以它变成[1, 2]。因为last 真的位于chunked 内部的子数组,chunked 现在看起来像这样:[[1, 2]]

    在下一次迭代中,值为 3,if 条件为真,因为现在last[1, 2],因此具有所需的长度 2。此时,last 的值被留下原封不动。这个子阵列现在是“满的”。一个 new 子数组被附加到chunked,所以它看起来像[[1, 2], [3]]

    在下一次迭代中,值为 4,现在 last 将被分配更新的子数组,即 [3]。就这样继续下去……

    【讨论】:

    • 谢谢!我从没想过将数字推入“last”也会调整“chunked”变量。我明白你所说的 last 是 [1] 的意思,但我自己永远不会明白,如果我将一个数字推入 last 以使其成为 [1,2],“chunked”也会反映这一点。每天学习新东西
    • 不客气!我看到您发现另一个答案更有用,因为您将其标记为已接受;-)
    • 哈哈我刚刚也标记了你的答案!两者都很有用 - 希望你们都能得到信任。这个网站还是半新的,所以不确定信用是如何工作的。但你似乎有很多!惊人的帮助。
    • 您只能将接受标记授予一个答案。一旦你有了更多的声誉,你就可以开始投票了。
    【解决方案2】:

    让我们来看看你的算法。使用 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. Last 现在是一个大小为 2 且形状为 [1, 2,] 的数组。自 last.length === len 以来,if 中的条件评估为 true。因此,当前值为 3 的数组被推入分块。 chunked 的大小现在是 2,形状是 [ [1, 2], [3] ]
    4. Last 已定义,是一个大小为 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. Last 是一个大小为 1 的数组,其中包含值 6。如果为假,则将 6 推到最后。 Last 的大小为 2,形状为 [5, 6],chunked 的形状为 [ [1, 2], [3,4], [5,6] ]

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

    【讨论】:

    • 非常感谢您提供的详细信息!超深;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多