代码之家  ›  专栏  ›  技术社区  ›  DarkFenix

如何使用Vue JavaScript对元素进行分组以在数组中添加数量

  •  1
  • DarkFenix  · 技术社区  · 6 年前

    我有一个列表,我从axios调用中得到,我尝试的是创建一个数组,其中具有相同id的产品,增加该产品的金额和小计,否则它们将按原样添加金额。

    但我总是得到数量=1.xx和一个错误的总数,我不明白为什么或哪里可以出现故障

     let dataGroup = [];
    
    
     resp.data.forEach((element)=>{
        let indexElement  = dataGroup.findIndex(elm => {
            return (elm.product_id === element.product_id ) && element.print;
        });
        if(indexElement !== -1){
            dataGroup[indexElement].total +=  parseFloat(element.total);
            dataGroup[indexElement].count +=  parseInt(element.count);
            roundNumber(dataGroup[indexElement].count,0);
            roundNumber(dataGroup[indexElement].total,2);
        }
        else{
            dataGroup.push(element);
        }
    });
    

    功能

    window.roundNumber = function(num, scale) {
      if(!("" + num).includes("e")) {
          return +(Math.round(num + "e+" + scale)  + "e-" + scale);
      } else {
          var arr = ("" + num).split("e");
          var sig = ""
          if(+arr[1] + scale > 0) {
          sig = "+";
          }
          return +(Math.round(+arr[0] + "e" + sig + (+arr[1] + scale)) + "e-" + scale);
      }
    }
    

    第一个实例中的数据组是空的,所有操作都是根据我用axios调用时收到的数据进行的,例如在图像中第一行我必须得到9的数量,但我收到的是1.00,单位值是35,在ST中应该是9*53,但不是这样

    enter image description here

    [
        {
            "id": 4,
            "product_id": 1,
            "count": "1.00",
            "total": "35.00",
            "print": 1
        },
        {    
           "id": 5,
            "product_id": 1,
            "count": "1.00",
            "total": "35.00",
            "print": 1
        },
        {
            "id": 6,
            "product_id": 1,
            "count": "1.00",
            "total": "35.00",
            "print": 1
        }
     ....
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Sajib Khan    6 年前

    这里有一些逻辑问题。选中此项(请参见代码中的注释):

    resp.data.forEach((element)=>{
      let indexElement  = dataGroup.findIndex(elm => {
        return (elm.product_id === element.product_id ) && element.print;
      });
      if(indexElement !== -1){
        // first convert total/count to float/int then update in existing array element
        dataGroup[indexElement].total += roundNumber(parseFloat(element.total), 0);
        dataGroup[indexElement].count += roundNumber(parseInt(element.count), 2);
      }
      else {
        // need to convert total/count to float/int then push to dataGroup
        element.total = roundNumber(parseFloat(element.total), 0);
        element.count = roundNumber(parseInt(element.count), 2);
    
        dataGroup.push(element);
      }
    });
        2
  •  0
  •   colefner    6 年前

    这是因为你初始化组中项目的方式。字符串值从服务器返回,然后您尝试将它们添加到浮动中。试着通过你的控制台运行这个。

    "35.00" + parseFloat("35.00")
    

    dataGroup.push(element)
    

    试试这个:

    dataGroup.push({
            id: element.id,
            product_id: element.product_id,
            total: parseInt(element.total),
            count: parseFloat(element.count),
            print: !!element.print,
    });
    

    fiddle