首页 > 解决方案 > 添加到 json 对象中的浮点数

问题描述

所以我有一个基于批次动态创建的 JSON 对象。我试图得到每批的总成本。列表中的每个对象都是不同的购买。

var lot_list = [{lot:123456,cost:'$4,500.00'}, {lot:654321, cost:'$1,600.00'}, {lot:123456, cost:'$6,500.00'}]

我想要每批的总成本,所以我尝试了

var totalBalances = {};
function addBalance(){
    lot_list.forEach(function(lots){
        totalBalances[lots[lot]] += parseFloat(lots['cost'].replace('$','').replace(',',''));
    });
}

这以我也尝试过的每批都具有零成本而告终

var totalBalances = {};
function addBalance(){
    lot_list.forEach(function(lots){
        totalBalances[lots[lot]] = parseInt(totalBalances[lots[lot]]) + parseFloat(lots['cost'].replace('$','').replace(',',''));
    });
}

非常感谢这些都没有任何帮助。

标签: javascriptarraysjson

解决方案


parseFloat('$4,500.00')由于无效字符,您无法获得求和的值。要删除美元符号和逗号,您可以使用替换;

> '$4,500.00'.replace(/[^\d\./g,'')
> "4500.00"

在这里,正则表达式将任何不是数字或小数位的内容与全局修饰符匹配以替换所有出现。

您可以使用Array.map()将对象数组映射到浮点值,以获取浮点值数组。

> lot_list.map((l) => parseFloat(l.cost.replace(/[^\d\.]/g,''))) 
> [4500, 1600, 6500]

使用浮点值数组,您可以使用Array.reduce()来获取总和;

> lot_list.map((l) => parseFloat(l.cost.replace(/[^\d\.]/g,''))).reduce((a,c) => a+c)
> 12600

编辑

要获得每个批次的总数,请映射一个包含批次 ID 的对象,然后减少到一个对象;

> lot_list
    .map((l) => { 
      return { 
        id: l.lot, 
        cost: parseFloat(l.cost.replace(/[^\d\.]/g,'')) 
      }
    })
    .reduce((a,c) => { 
      a[c.id] = a[c.id] || 0; 
      a[c.id] += c.cost; 
      return a; 
    }, {})
> { 123456: 11000, 654321: 1600 }    

在这里,reduce 函数创建一个对象作为累加器,然后如果之前没有对批次 id 求和,则将总和初始化为零。


推荐阅读