javascript - 添加到 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(',',''));
});
}
非常感谢这些都没有任何帮助。
解决方案
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 求和,则将总和初始化为零。
推荐阅读
- python - python - 如何将包含带有单引号的浮点值的列表转换为在python中没有单引号的那些值的列表?
- gatsby - 当我在 Contentful 上更改内容时需要重建 Gatsby 网站
- unit-testing - 如何使用 Mockito 取消模拟异常?
- javascript - 按道具值唯一性过滤对象数组
- get - 如何加快 $tags = get_meta_tags
- c++ - std::basic_fstream
在 Linux 上不起作用 - angular - 如何在具有单独数据库和后端的 jenkins 上运行 cypress?
- javascript - 在reactjs中的返回内映射
- unit-testing - Test_xxx func 在 golang 中访问共享数据是否安全?
- elasticsearch - 收集 Elasticsearch 访问日志