Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-算法练习-将数组分成小块_Javascript - Fatal编程技术网

JavaScript-算法练习-将数组分成小块

JavaScript-算法练习-将数组分成小块,javascript,Javascript,我有一个算法练习,它将数组分割成更小的部分。这是正常工作,但我不理解操作。有人能给我详细解释一下吗。求你了 const字母=['a','b','c','d','e'] 功能块(数组、大小){ 常量块=[]; for(数组的let元素){ const last=chunked[chunked.length-1] 如果(!last | | last.length==大小){ chunked.push([元素]) }否则{ 最后。推(元素) } } 返回分块; } console.log(块(字母,2

我有一个算法练习,它将数组分割成更小的部分。这是正常工作,但我不理解操作。有人能给我详细解释一下吗。求你了

const字母=['a','b','c','d','e']
功能块(数组、大小){
常量块=[];
for(数组的let元素){
const last=chunked[chunked.length-1]
如果(!last | | last.length==大小){
chunked.push([元素])
}否则{
最后。推(元素)
}
}
返回分块;
}
console.log(块(字母,2))
它返回:

['a','b']
['c'.'d']
['e']
在本例中,该参数是在函数中传递的数字2,它是每个数组包含的项数

console.log(chunk(letters, 2))

我不明白它生成了两个数组“chunked”和“last”,最后只返回“chunked”。但是我不理解两个数组之间的联系:“chunked”和“last”

您正在创建一个数组数组。外部数组称为
chunked
last
数组是到目前为止的最后一个内部数组<代码>分块看起来像:

[[/*some values*/], [/*some values*/], [/* this is last */]]
这条线就是这么做的:

const last = chunked[chunked.length - 1] // get the final child array in chunked
if (!last || last.length === size) 
然后决定是将当前值推入该子阵列还是添加新子阵列。这个选择取决于
last
的长度是否小于块大小——换句话说,它是否已满。这就是本测试的目的:

const last = chunked[chunked.length - 1] // get the final child array in chunked
if (!last || last.length === size) 
!last
部分用于检查是否存在
last
数组,因为在第一次迭代时它还不存在-外部数组为空

为了更好地理解它,您只需使用一个按块大小递增的简单循环:

const字母=['a','b','c','d','e']
功能块(数组、大小){
常量块=[];
for(设i=0;iconsole.log(chunk(字母,2))
通常有三件事:

  • last
    包含每次迭代新获取的最后一个块,该块将一直增长,直到达到指定的大小
  • last
    达到指定大小时,
    chunked.push([element])
    将新数组推入
    chunked
    [element]
    前面没有数组,这是一个简短的语法,用于创建一个带有单个元素的新数组-对于下一次迭代,这将是
    最后一个
    块。尝试将
    console.log(1)
    console.log([1])
    console.log([1,2])
    写入JS控制台,查看它们的区别
  • 如果
    最后一个
    块未达到指定的大小,则只需将
    元素
    附加到它

  • 特别是对于第一次迭代,有一个“技巧”:当
    chunked
    在开始时是一个空数组时,
    last=chunked[chunked.length-1]
    转换为
    chunked[-1]
    。与许多其他语言不同,JavaScript在这里不会消亡或抛出异常,它只是说给定的元素是
    未定义的
    ,这是一个错误的值,会触发
    !last
    条件,从而触发
    推送([element])
    东西将运行。这是第一个区块的创建方式。

    这将获得
    区块
    数组的最后一个元素,即
    未定义
    或最后一个区块数组

    const last = chunked[chunked.length - 1]
    
    然后检查
    last
    是否为
    undefined
    或是大小为
    size
    的数组,然后使用当前元素将新数组添加到
    chunked
    数组中

    if (!last || last.length === size) {
      chunked.push([element])
    }
    
    否则,这意味着last是一个大小小于
    size
    的数组,您将当前元素推到last

    else {
      last.push(element)
    }
    
  • 一个函数
    chunk
    ,它有两个参数,一个数组和chunk的长度
  • 定义了一个
    分块的
    数组
  • 使用
    for
    循环遍历数组
  • 如果
    last
    数组不是
    chunked
    数组中的最后一个数组,或者
    chunked
    数组的最后一个元素等于size参数,则从另一个数组中的
    array
    数组推送新元素,使其形成一个chunked数组
  • 否则将新元素从
    array
    array推送到
    chunked
    array的最后一个数组
  • 返回
    chunked
    数组

  • 或多或少:初始化空数组
    chunked

    在循环内部:查看
    chunked
    的最后一个元素。它是不存在的,还是已经完全达到了所需的长度?如果是,则取下一个字母,从中创建一个1元素数组,并将其附加到
    chunked
    。如果不是,则将该字母附加到
    chunked
    的最后一个元素


    在调试器中运行代码,为
    chunked
    last
    element
    设置监视表达式,并观察它们发生了什么。

    您到底不明白什么?它生成了两个数组“chunk”和“last”,最后只返回“chunked”。但我不明白“last”数组链接