• 【对比数组相同字段】在单个数组中根据相同字段进行业务操作,双重for循环,去重数组


    业务需求:
    在单个数组中,不同的货物名称有多条。

    其中相同的货物名称也可以有多条。

    相同的货物名称中根据归类标准进行控制,如果数量超了或者价格超了,

    都要进行不同的操作,比如数量超了,判断条件是所有的货物名称的数量累加

    与一个标准数量进行比对,累加超了才算超。

    而价格是单行,只要有一行超了标准价格,整个都算超。

    那就要根据数组中的货物名称进行比较,相同的货物名称要按业务需求进行对比。

    难点就是,如何在单个数组中去做这件事,仅一个for循环似乎很难实现

    感谢同事给的思路,这里提供两种方法供参考

    首先是双重for循环,外层从0开始,内层从i+1开始,判断相邻的两项的code是否一致,sum1累加所有的数量,然后进行判断

                let sum1 = 0
                 let sum2 = 0
                for (var i = 0; i < arr.length; i++) {
                for (var j = i + 1; j < arr.length; j++) {
                    if (arr[i].Code == arr[j].Code) {
                     sum1 = arr[j].qty + arr[i].qty
                    arr[i].totalQty = sum2
                      arr[j].totalQty = sum2
                     // 超数量
                 if (arr[i].totalQty > arr[i].configAmount) {
                   if (arr[i].controType == '1' || (arr[i].controType == '3'      			&& arr[i].totalQty > arr[i].configAmount)) {
                       arr[i].configStatus = '2'
                     }
                    }
    
                     // 超金额
                      else if (arr[i].priceAmt > arr[i].priceCeiling || arr[j].priceAmt > arr[j].priceCeiling) {
                     for (var s = 0; s < arr.length; s++) {
                        arr[s].configStatus = '3'
                     }
                    }
                   }
                 }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    双重for循环只能是提供个思路,因为需求有些复杂,有些东西不好实现

    就只能用下面这种方法,将原数组去重之后和原数组进行对比
    根据货物名称进行去重,去重后的数组每一项货物名称都是唯一的,然后和原数组进行对比,这样能保证对比条件是成立的。

    首先去重原数组,直接复制就行了,我之前手敲一遍,括号括错了,导致怎么写都无法去重

       // 原数组去重
        filterDarr(arr) {
          const res = new Map()
          return arr.filter(item => !res.has(item.Code) && res.set(item.Code, 1))
        },
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在需要处理的方法里

      let newDarr = this.filterDarr(this.tableData)
      //先循环去重的数组
        for (var i = 0; i < newDarr.length; i++) {
        //定义变量去累加数量
        newDarr[i].totalQty = 0
        for (var j = 0; j < this.tableData; j++) {
        if (arr[j].Code == newDarr[i].Code) {
        //进行数量的累加赋值
          newDarr[i].totalQty += arr[j].qty
          //业务的处理
             if (arr[j].controType == '1') {
                          if (newDarr[i].totalQty > arr[j].configAmount && newDarr[i].priceCeiling < 50000) {
                            arr[j].configStatus = '2'
                          } else if (newDarr[i].totalQty > arr[j].configAmount && newDarr[i].priceCeiling > 50000) {
                           
                            arr[j].configStatus = '4'
                          } else {
                            arr[j].configStatus = '1'
                          }
                        } 
               }
                    }
                  }        
    
    然后调接口传值给后端,还是传原数组
            getBySum(this.tableData).then(res => {-----}
    
    • 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
  • 相关阅读:
    MySQL进阶实战6,缓存表、视图、计数器表
    RK3568-drm框架
    UWF 常用命令及蓝屏修复
    网络的地址簿:Linux DNS服务的全面指南
    【21天python打卡】第13天 网络爬虫(4)
    Java CC 解析 SQL 语法示例
    C++ Qt数据库模块介绍
    【微信小程序】使用npm并引入vant-weapp组件库
    工作流之Flowable与SpringBoot结合
    签个到吧codeforces898
  • 原文地址:https://blog.csdn.net/weixin_49668076/article/details/126359025