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

时间:2019-03-24 16:19:23

标签: javascript

我进行了此算法练习,将数组分成较小的部分。这是正确的工作,但我不了解操作。有人可以向我详细解释一下。请。

const letters = ['a', 'b', 'c', 'd', 'e']

function chunk(array, size) {
  const chunked = [];

  for (let element of array) {
    const last = chunked[chunked.length - 1]

    if (!last || last.length === size) {
      chunked.push([element])
    } else {
      last.push(element)
    }
  }

  return chunked;
}


console.log(chunk(letters, 2))

它返回:

['a','b']
['c'.'d']
['e']

此参数(在本例中为数字2)在函数中传递,该参数是每个数组包含的项目数。

console.log(chunk(letters, 2))

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

5 个答案:

答案 0 :(得分:0)

您正在创建一个数组数组。外部数组称为chunkedlast数组是到目前为止的最后一个内部数组。 chunked看起来像:

[[/*some values*/], [/*some values*/], [/* this is last */]]

这是此行正在做的事情:

const last = chunked[chunked.length - 1] // get the final child array in chunked

然后您决定是将当前值压入此子数组还是。该选择由last的长度是否小于块大小确定,换句话说,是否为完整块。这就是测试的目的:

if (!last || last.length === size) 

!last部分用于检查是否存在last数组,因为在第一次迭代中它尚不存在-外部数组为空。

对于它的价值,您可能会更容易理解,您只需使用一个简单的循环,该循环将按块大小递增:

const letters = ['a', 'b', 'c', 'd', 'e']

function chunk(array, size) {
    const chunked = [];
    
    for (let i = 0; i < array.length; i+=size) {
        chunked.push(array.slice(i, i+size))
    }
    return chunked
}


console.log(chunk(letters, 2))

答案 1 :(得分:0)

通常有三件事:

  1. last包含最后一个块,它是每次迭代中新获取的,直到最后达到指定大小为止。
  2. last达到指定大小时,chunked.push([element])将新数组推入chunked[element]前面没有数组,这是用于创建一个具有单个元素的新数组-下一次迭代将是last块,请尝试将console.log(1)console.log([1])以及也许console.log([1,2])写入JS控制台看到它们的区别。
  3. 如果last块尚未达到指定的大小,则仅将element附加到其上

特别是对于第一次迭代有一个“技巧”:当chunked在开始时是一个空数组时,last = chunked[chunked.length - 1]转换为chunked[-1]。与许多其他语言不同,JavaScript不会在此处死亡或引发异常,它只是说给定的元素是undefined,这是一个虚假的值并触发!last条件,因此push([element])事情会运行。这就是创建第一个块的方式。

答案 2 :(得分:0)

这将获取chunked数组的最后一个元素,它可以是undefined或最后一个块数组

const last = chunked[chunked.length - 1]

然后检查lastundefined还是大小为size的数组,然后将新数组添加到带有当前元素的chunked数组中

if (!last || last.length === size) {
  chunked.push([element])
}

else,这意味着last是一个大小小于size的数组,您将当前元素推到last

else {
  last.push(element)
}

答案 3 :(得分:0)

  1. 一个函数chunk,它带有2个参数,一个数组和块的长度
  2. 定义了chunked数组
  3. 使用for循环遍历数组
  4. 如果last数组不是chunked数组中的最后一个数组,也不是chunked数组的最后一个元素等于size参数,则从array数组中推送新元素在另一个数组中,以便形成分块数组
  5. 否则将新元素从array数组推到chunked数组的最后一个数组
  6. 返回chunked数组

答案 4 :(得分:0)

或多或少:初始化一个空数组chunked

在循环内:查看chunked的最后一个元素。它是不存在的,还是已经精确地要求的长度?如果是,请获取下一个字母,从中取出一个1元素的数组,并将其附加到chunked上。如果不是,则将字母附加到chunked的最后一个元素上。

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