什么是数组删除的最优解

158 阅读2分钟

delete 和 splice

平时看了很多的文章都说 spice 性能比较差,删除一位要改变所有元素的位置性能开销比较大,建议用 delete

这两天正好想试一试,但是尝试一番发现并没有想象中的那样是碾压之势

        <el-checkbox
          v-model="checkList"
          style="margin: 10px auto"
          :label="item.id"
          @change="setCheck(item)"
          border
          >{{ item.title }}</el-checkbox
        ><el-checkbox-group v-model="checkList" @change="getCheckbox"
          ><div
            style="display: flex; justify-content: flex-start; flex-wrap: wrap"
          >
            <el-checkbox
              v-for="m in item.menu"
              :key="m.id"
              :label="m.id"
              style="margin: 5px 5px"
              @change="setCheckbox(item)"
              >{{ m.title }}</el-checkbox
            >
          </div></el-checkbox-group
        >
      </div>

dom 结构差不多是这样的,因为都是从后台获取的数据,结构也是一个大选项下若干个小选项,我就直接用了

两个 v-for 后端说大选项的 id 也要上传然后选项数量也没定我就这样写想着一次搞完,所有的都是绑定一个数组

然后实现大标题能够实现全选和取消全选,本菜鸡想了半天想到的就如下

 setCheck(e) {
  // 判断当前选了没有
    开始我的想的搜索一下,用some来看有没有
  // let is = this.checkList.some((i) => {
  //   return i === e.id;
  // });
  随后发现当前选的总是在最后一位就直接对比最后一位
  let is = this.checkList[this.checkList.length - 1] === e.id;
  // 选了就删除下面所有的
  if (!is) {
    // 遍历当前下面的按钮
    e.menu.forEach((item) => {
      // 有就删了
      this.checkList.some((el, index) => {
        if (el === item.id) delete this.checkList[index];
        // if (el === item.id) this.checkList.splice(index, 1);
        return el === item.id;
      });
    });
    开始想着完事就清楚空的位置,但是后来放到了提交的地方一起清空
    // this.checkList = this.tool.compact(this.checkList);
  } else {
    // 没有就加上所有的
    e.menu.forEach((item) => {
      this.checkList.push(item.id);
    });
  }
},

然后是子选项,子选项为空的时候取消大选项的,有一个子选项的时候选上大的

    setCheckbox(e) {
  查看大选项有没有选上
  let is = this.checkList.some((i) => {
    return i === e.id;
  });
  查看大选项下有没有子选项选中了
  let isMenu = e.menu.some((el) => {
    return this.checkList.some((item) => {
      return el.id === item;
    });
  });
  没有就删了
  if (!isMenu) {
    let index = this.checkList.findIndex((element) => element === e.id);
    this.checkList.splice(index, 1);
  }
  没有就勾上
  if (!is) {
    this.checkList.push(e.id);
  }
},

image.png

整个结构是这样的,个人感觉实现的十分丑陋,希望各位能指点指点,由于实现的比较丑陋我就十分在意性能

结果也是没让我失望,在快速点击大标题下i5-9400f的占用能跑到30%多,我不自觉就笑了,面向性能编程开创人

然后我就想起数组的删除,想从这里优化减少消耗,但是用了delete继续快速点击发现并没有更低,反而上限还

高了,和我预期是很不符,我期望他至少也该下降一点,没想到反而多了一点,求指点迷津