手写函数-数组分块

344 阅读2分钟

前言

通过手写JS方法,加强对JS方法的理解,巩固原生JS基础。本次要实现的方法是数组分块,通过给定值,将数组分成指定大小,实现难度不大。

数组分块

chunk()

说明:

  • 语法:chunk(array,size)
  • 功能:将数组拆分成多个size长度的区块,每个区块组成小数组,整体组成一个二维数组
  • 例子:[1,2,3,4,5] 调用chunk(arr,3) =>[[1,2,3],[4,5]]

实现:

  • 结构:方法接收两个参数,第一个参数为原数组,第二个为每一个子数组的个数(默认为1,可以这样写size=1,表示如果不穿size就默认为1)

  • 功能实现:

    利用临时生成一个固定大小的容器,将原数组中的元素存入到容器中,如果容器满了就pushresult中,然后将临时数组置空。最后一次需要判断容器还有没有值,因为可能因为元素个数不够装满容器导致没有pushresult中,所以需要将容器剩下的元素pushresult中。

    • 声明两个数组变量:resulttmp。先将数组存到临时数组tmp,再存到result,这是tmp存在的意义

    • 遍历

      • itempushtemp

      • 判断临时数组是否已经装满

        • 装满则将temp临时数组pushresult
        • 置空临时数组。注意还要置空,我在自定义时忘了置空,导致临时数组长度和原数组一样
    • 判断临时数组是否大于0

      • 如果大于0,则表示临时数组还有数,因为没有装满没有push。所以再将临时数组pushresult
    • 返回result

代码

chunk.js

function chunk(arr, size = 1) { //size=1 表示如果不传size,就默认为1
  // 定义返回数组
  let result = []
  // 定义临时数组
  let temp = []
  arr.forEach(item => {
    temp.push(item)
    // 判断temp容器是否装满。
    if (temp.length === size) {
      // 装满就将临时数组push到result
      result.push(temp)
      // 置空临时数组。
      temp = []
    }
​
  })
  // 判断容器是否还有值。
  if (temp.length !== 0) result.push(temp)
  // 返回结果
  return result
}

chunk.html

<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <script src="./chunk.js"></script>
</head><body>
  <script>
    let arr = [1, 2, 3, 4, 5]
    let arrNew = chunk(arr)
    console.log(arrNew)
  </script>
</body></html>

\