代码之家  ›  专栏  ›  技术社区  ›  claudiopb

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

  •  -2
  • claudiopb  · 技术社区  · 6 年前

    我有一个算法练习,它将数组分割成更小的部分。这是正确的,但我不明白操作。有人能给我详细解释一下吗。拜托。

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

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

    3 回复  |  直到 6 年前
        1
  •  0
  •   Mark    6 年前

    您正在创建一个数组数组。外部数组被调用 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 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))
        2
  •  0
  •   tevemadar    6 年前

    通常有三件事:

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

    特别是对于第一次迭代,有一个“诀窍”:什么时候 分块 开头是一个空数组, last = chunked[chunked.length - 1] 翻译成 chunked[-1] . 与许多其他语言不同,JavaScript不会死或在这里抛出异常,它只是说给定的元素是 undefined ,这是一个错误的值,并触发 !last 条件,因此 push([element]) 事情会好起来的。这就是第一个块的创建方式。

        3
  •  0
  •   Ali Faris    6 年前

    这将得到 chunked 数组,可以是 undefined 或最后一个块数组

    const last = chunked[chunked.length - 1]
    

    然后你检查 last 未定义 或是大小为 size 然后将新数组添加到 分块 使用当前元素的数组

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

    否则,这意味着最后一个数组的大小小于 大小 ,将当前元素推到最后

    else {
      last.push(element)
    }
    
        4
  •  0
  •   Sushant Magoo    6 年前
    1. 函数 chunk 包含两个参数,一个数组和一段长度
    2. chunked 数组已定义
    3. 使用 for 循环遍历数组
    4. 如果 last 数组不是内部的最后一个数组 分块 数组或最后一个元素 分块 数组等于size参数,然后从 array 另一个数组中的数组,以便它形成一个分块数组
    5. 否则将新元素从 阵列 数组到最后一个数组 分块 阵列
    6. 返回 分块 阵列
        5
  •  0
  •   mbojko    6 年前

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

    圈内:观察 分块 的最后一个元素。它是不存在的,还是已经完全是需要的长度?如果是,取下一个字母,从中创建一个1元素数组,并将其附加到 分块 . 如果没有,则将字母附加到 分块 的最后一个元素。

    在调试器中运行代码,设置监视表达式 分块 , last element 看看他们身上发生了什么。