如何使用Vue JavaScript对元素进行分组以添加数组中的金额

时间:2018-11-14 17:23:50

标签: javascript vue.js vuejs2

我有一个从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);
  }
}

dataGroup在第一个实例中为空,一切都根据我从axios进行的呼叫接收到的数据而工作,例如,在图像中,第一行我必须获得9个数量,但我收到1.00,单位值为35应该是ST中的9 * 53,但是不是那样的

enter image description here

对axios的响应

[
    {
        "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 个答案:

答案 0 :(得分:1)

在这里您遇到一些逻辑问题。对此进行检查(请参见代码中的注释):

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);
  }
});

答案 1 :(得分:0)

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

"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