Javascript 分块算法帮助JS

Javascript 分块算法帮助JS,javascript,arrays,constants,chunking,Javascript,Arrays,Constants,Chunking,在JS中进行一些初学者算法练习。我不明白“分块”在“如果”语句中是如何工作的 我的主要困惑是在迭代到第二个值之后;因为在第一次运行中,它满足最后一次未定义的标准;所以“1”被推入分块变量。因此,一旦第二个变量进入,2,因为last现在已定义,last的长度不等于“len”参数,它将转到else部分。2将被推入“last”,并形成last=“[1],2” 然后,当第三个值(3)开始出现时,我会更加困惑。if语句的chunked.push([number])如何知道在此时的数字也是3时将[1]和[2

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

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

然后,当第三个值(3)开始出现时,我会更加困惑。if语句的chunked.push([number])如何知道在此时的数字也是3时将[1]和[2]精确地推送到chunked中?它省略了3吗?。我知道last的长度在那个点上与len相遇,但它是如何从[1,2]到chunk[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))


一个关键的洞察可能是
chunked
是一个数组数组

在本例中,在第二次迭代中,
分块
将不是
[1]
,而是
[[1]]
。请注意,它是一个数组的数组。因此,
last
被分配到
chunked
中唯一的子数组,即
[1]
,在
else
块中,值2被附加到该子数组中,因此它成为
[1,2]
。因为
last
实际上是
chunked
内部的子数组,
chunked
现在看起来是这样的:
[[1,2]]

在下一次迭代中,值为3,如果条件为真,因为现在最后一次为[1,2],因此具有所需的长度2。此时,
last
的值保持不变。此子阵列现在已“满”。一个新的子数组被附加到
分块
,因此它看起来像
[[1,2],[3]]


在下一次迭代中,值为4,现在
last
将被分配新的子数组,即
[3]
。所以它继续…

让我们看看你的算法。使用两个参数调用Chunked数组:
[1,2,3,4,5,6]
,len为
2
,这是块的所需大小。在函数内部,定义了一个空数组
chunked
。现在,函数在数组
arr
上迭代

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

  • 此时,数组上的迭代终止,因为没有更多的条目,函数返回chunked,当打印时,其形状与步骤6中的chunked相同。该函数只需遍历输入数组并复制到一个新数组,条件是新数组中的条目都是大小为
    len
    的数组,其中的值从
    arr
    连续获取

    谢谢大家!!我从未想过,将数字推入“last”也会调整“chunked”变量。我明白你说的“最后一个是[1]是什么意思,但我自己永远也想不到,如果我把一个数字推到最后一个,使之成为[1,2],“chunked”也会反映这一点。。每天学习新的东西不客气!我看到您发现另一个答案更有用,因为您将其标记为已接受;-)哈哈,我刚才也记下了你的答案!这两个都很有用——希望你们都能得到荣誉。这个网站仍然是半新的,所以不知道信用如何运作。但你似乎有很多!惊人的帮助。您只能对一个答案授予接受分数。一旦你有了更多的声誉,你就可以开始投票了。非常感谢你提供的详细信息!超深;