随笔(四)——代码优化

文章目录


前言

原逻辑:后端data数据中返回数组,数组中有两个对象,一个是属性指标,一个是应用指标,根据这两个指标展示不同的多选框


1.原本代码

javascript 复制代码
getIndicatorRange(indexReportList, target) {
  const indexList = []
      const indexObj = {}
      indexReportList.forEach(item => {
        item.showReportFieldList.forEach(fieldItem => {
          indexObj[fieldItem.showFieldTag] = {
            checked: target.includes(fieldItem.showFieldTag),
            disabled: item.name === '属性指标'
          }

          if (target.includes(fieldItem.showFieldTag)) {
            indexList.push({
              ...fieldItem,
              // isAttri: item.name === '属性指标', // 判断是否是属性指标
              disabled: item.name === '属性指标'
            })
          }
        })
      })
  return {
        indexList,
        indexObj
      }
 },



indexReportList.forEach(item => {
        const tarList = [...target] // 浅拷贝数组
        tarList.forEach(tarItem => {
          item.showReportFieldList.forEach(fieldItem => {
            indexObj[fieldItem.showFieldTag] = {
              checked: tarItem === fieldItem.showFieldTag,
              disabled: item.name === '属性指标'
            }

            if (tarItem === fieldItem.showFieldTag) {
              indexList.push({
                ...fieldItem,
                // isAttri: item.name === '属性指标', // 判断是否是属性指标
                disabled: item.name === '属性指标'
              })
            }
          })
        })
      })

2.新增逻辑

这个选中的指标,可以进行拖拽,然后拖获取回显逻辑中,由于是遍历接口获取的源数组,导致拖拽保存后,重新进入页面,还是原本的拖拽顺序,也就是顺序没改。

3.优化逻辑

正常是在最外层使用遍历拖拽后的新数组,获取一个新的源数组进行渲染,但是这样加上本身的for循环,就有三层for循环了。优化后的代码如下:拷贝展示数据,遍历这个数据,将里面的是否存在,直接和item 的数据进行判断即可

优化后的代码

javascript 复制代码
getIndicatorRange(indexReportList, target) {

  const indexList = []
      const indexObj = {}
      const targetMap = new Map();
      // 构建 targetMap,保持 target 的顺序
      target.forEach((tarItem, index) => {
        targetMap.set(tarItem, index);
      });
      indexReportList.forEach(item => {
        item.showReportFieldList.forEach(fieldItem => {
          const showFieldTag = fieldItem.showFieldTag;
          const isAttri = item.name === '属性指标';
          // 更新 indexObj
          if (!indexObj[showFieldTag]) {
            indexObj[showFieldTag] = {
              checked: false,
              disabled: isAttri
            };
          }
          // 如果 showFieldTag 在 target 中,更新 indexObj 并插入 indexList
          if (targetMap.has(showFieldTag)) {
            indexObj[showFieldTag].checked = true;
            // 插入 indexList,保持 target 的顺序
            indexList[targetMap.get(showFieldTag)] = {
              ...fieldItem,
              disabled: isAttri
            };
          }
        })
      })
  return {
        indexList,
        indexObj
      }
},
相关推荐
高级程序源44 分钟前
django大学生创新创业项目管理系统94923-计算机课程设计、毕业设计
javascript·vue.js·spring boot·后端·python·django·课程设计
lizz22761 小时前
Babel插件手册
javascript
VXbishe4 小时前
【课程设计】基于SpringBoot的乡村政务服务系统的设计与实现-计算机毕设77011
javascript·vue.js·spring boot·python·php·课程设计·政务
志尊宝4 小时前
Vue3 零基础每日笔记(037):动手封装 useMouse 与 useWindowSize——事件监听的标准模板
前端·javascript·vue.js·笔记·html5
shmily麻瓜小菜鸡5 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
BillKu5 小时前
vue3双向邦定:使用defineModel替换defineProps+defineEmits
vue.js
wcy03106 小时前
POST为什么会发送两次请求
javascript·ajax
志尊宝6 小时前
Vue3 零基础每日笔记(047):动态路由与路由参数——:id 传参、query 传参、props 解耦
前端·javascript·vue.js·笔记·html5
计算机毕设定制辅导-无忧学长6 小时前
《基于SpringBoot的中学教师数字胜任力测评网站的设计与实现》
java·vue.js·spring boot·mysql·中学教师数字胜任力测评网站
flash俊杰9 小时前
Vue 3 响应式陷阱与状态单例:从 TDZ 白屏到跨进程 Proxy 剥离
vue.js