Javascript 分块算法帮助JS
在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也会被推到“最后” 如果这听起来也让人困惑,我很抱歉!我在网上看了很多关于解决这个问题的教程,但没有详细的解释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
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
上迭代
!最后一个
条件为true,因此,[1]
被推到块中。现在chunked具有以下形状:[[1]]
[1]
<代码>!last为false,而last.length==len
也为false,因为len为2。所以,2被推到了最后。last的形状是[1,2]
,而chunked的形状是[[1,2]]
[1,2,]
的数组。if中的条件的计算结果为true,因为last.length==len
。所以,当前值为3的数组被推入分块。分块的大小现在是2,形状是[[1,2],[3]]
李>
[3]
的数组。如果计算为false,则将4推入最后一个。最后一个现在有尺寸2和形状[3,4]
。分块数组的大小为2,形状为[[1,2],[3,4]]
[[1,2],[3,4],[5]]
[[1,2],[3,4],[5,6]]
此时,数组上的迭代终止,因为没有更多的条目,函数返回chunked,当打印时,其形状与步骤6中的chunked相同。该函数只需遍历输入数组并复制到一个新数组,条件是新数组中的条目都是大小为
len
的数组,其中的值从arr
连续获取 谢谢大家!!我从未想过,将数字推入“last”也会调整“chunked”变量。我明白你说的“最后一个是[1]是什么意思,但我自己永远也想不到,如果我把一个数字推到最后一个,使之成为[1,2],“chunked”也会反映这一点。。每天学习新的东西不客气!我看到您发现另一个答案更有用,因为您将其标记为已接受;-)哈哈,我刚才也记下了你的答案!这两个都很有用——希望你们都能得到荣誉。这个网站仍然是半新的,所以不知道信用如何运作。但你似乎有很多!惊人的帮助。您只能对一个答案授予接受分数。一旦你有了更多的声誉,你就可以开始投票了。非常感谢你提供的详细信息!超深;