js将一个数组分割成多个数组,循环多次请求接口

862 阅读1分钟

项目中后台因限制超过20条的数组集合id字符串超过20条,将不返回数据,遂导致如果超过20的数据即返回空数据,因此,换种思路,将数组按20条进行截取拆分,然后根据拆分后的数组的长度去循环,循环发送请求. 先定义一个对数组按长度拆分的方法

    // size每组数组多少个,如:10
    // array需要拆分的数组
    splitArray(array, size) {
      let data = [];
      for (let i = 0; i < array.length; i += size) {
        data.push(array.slice(i, i + size))
      }
      return data
    },

先看看当前函数返回结果长啥样,先造一个数据看看返回的值:

let numArr = [
      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
      22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39,
    ];
    let splitArrData = this.splitArray(numArr, 7);
    console.log("splitArrData---", splitArrData);

splitArrData值为:

image.png 因此,代码即可这样写:

if (this.answerList.length <= 20) {
      const answerIdArr = this.answerList.map((item) => item.id).join(",") || "";
      if (answerIdArr) {
        this.getCommentList(answerIdArr);
      }
    } else {
      let idsArr = this.splitArray(this.answerList.map(item => item.id), 20)
      idsArr.forEach(it => {
        this.getCommentList(it.join(','))
      })
    }

虽然这种方法能够避免接口限制超过20条不返回数据的问题,暂时解决了数据返回,但是在初始化时对接口对此请求,对网页加载性能有很大影响,最适宜的方法还是利用监听滚轮事件,监听滚轮滚动距离,去加载数据,然后判断滚动距离/浏览器高度,得到的数值跟splitArray处理后的数组长度对比,如果超过长度,就不请求。后续会把该方法替代,先解燃眉之急!