随笔(四)——代码优化

文章目录


前言

原逻辑:后端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
      }
},
相关推荐
代码老y32 分钟前
十年回望:Vue 与 React 的设计哲学、演进轨迹与生态博弈
前端·vue.js·react.js
zzywxc78741 分钟前
详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
开发语言·javascript·人工智能·深度学习·金融·prompt·流程图
大明8841 分钟前
用 mouseover/mouseout 事件代理模拟 mouseenter/mouseleave
前端·javascript
林太白1 小时前
Nuxt.js搭建一个官网如何简单
前端·javascript·后端
晴空雨1 小时前
一个符号让 indexOf 判断更优雅!JavaScript 位运算的隐藏技巧
前端·javascript
前端snow1 小时前
前端无接口实现Table导出Excel的两种方案(附完整代码)
javascript·vue.js·react.js
古夕2 小时前
my-first-ai-web_问题记录03——NextJS 项目框架基础扫盲
前端·javascript·react.js
曲意已决2 小时前
《深入源码理解webpac构建流程》
前端·javascript
CC__xy2 小时前
04 类型别名type + 检测数据类型(typeof+instanceof) + 空安全+剩余和展开(运算符 ...)简单类型和复杂类型 + 模块化
开发语言·javascript·harmonyos·鸿蒙
小奋斗3 小时前
深入浅出:ES5/ES6+数组扁平化详解
javascript·面试