如何减少字符串价格的对象数组

Posted

技术标签:

【中文标题】如何减少字符串价格的对象数组【英文标题】:how to reduce an array of objects of stringed price 【发布时间】:2022-01-01 18:10:12 【问题描述】:
var groceries = [
  
    id: 1,
    product: 'Olive Oil',
    price: '$' + 12.1
  ,
  
    id: 2,
    product: 'Tomato Soup',
    price: '$' + 3.48
  ,
  
    id: 3,
    product: 'Cheesecake',
    price: '$' + 17.36
  ,
  
    id: 4,
    product: 'Sirloin Steak',
    price: '$' + 14.8
  ,
  
    id: 5,
    product: 'Brie Cheese',
    price: '$' + 23.28
  
];

var sum = _.reduce(products, function (total, price) 
    return total + price;
  , 0);

在我们开始添加价值之前,我不太确定如何从价格中删除“$”。我已经尽力在这里寻找其他解决方案(我是新手),但似乎只有“价格”只是数字的例子。

对不起,如果这个类似的问题已经在其他地方发布了,但我仍在学习如何在这里导航,除非有人能指出我,否则我还没有找到类似的情况!

【问题讨论】:

一种方法是return total + parseFloat(price.slice(1));,但正如后来的 cmets 建议的那样,存储货币并不是最好的举措。只需存储数字,稍后添加货币即可显示。 您可以控制groceries 数据吗?如果是这样,您能否向仅包含原始价格数字值的对象添加另一个属性(例如 priceNumber: 21.1 为什么不存储没有货币符号的价格。如有必要,将其存储在不同的属性中。 @NickParsons 不幸的是,我无法控制数据.. 【参考方案1】:

在代码中,您当前使用的price 是具有数组属性的每次迭代的对象。相反,您可以从对象中获取价格属性。

在您的示例数据中,只有前导 $ 可以从价格属性中删除。然后您可以使用例如 parseFloat 并仅在转换未产生 NaN 时添加该值。

然后将groceries 变量传递给reduce,而不是示例代码中不存在的products

请注意,目前我们正在添加相同货币的值,如果您使用不同的货币,则在计算总和时必须考虑到这一点。

var groceries=[id:1,product:'Olive Oil',price:'$'+12.1,id:2,product:'Tomato Soup',price:'$'+3.48,id:3,product:'Cheesecake',price:'$'+17.36,id:4,product:'Sirloin Steak',price:'$'+14.8,id:5,product:'Brie Cheese',price:'$'+23.28,id:6,product:'Product with invalid price',price:'$'+"hello"];

var sum = _.reduce(groceries, function (total, obj) 
  var price = parseFloat(obj.price.replace(/^\$/, ''));
  if (!isNaN(price)) 
    return total + price;  
  
  return total;
, 0);

console.log(sum)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.2/underscore-min.js"></script>

【讨论】:

【参考方案2】:

这里,我使用了 javascript 的默认函数 reduce 来获取累计和。

var groceries = [
  
    id: 1,
    product: 'Olive Oil',
    price: '$' + 12.1
  ,
  
    id: 2,
    product: 'Tomato Soup',
    price: '$' + 3.48
  ,
  
    id: 3,
    product: 'Cheesecake',
    price: '$' + 17.36
  ,
  
    id: 4,
    product: 'Sirloin Steak',
    price: '$' + 14.8
  ,
  
    id: 5,
    product: 'Brie Cheese',
    price: '$' + 23.28
  
];

//reduce((total, currentIteratedValue) => , initialCumulativeValue)
//Initially we take sum as 0
const sum = groceries.reduce(function (currentTotal, obj) 
  var price = parseFloat(obj.price.slice(1));
  if (!isNaN(price)) return currentTotal + price;  
  return currentTotal;
, 0);


console.log(sum)

【讨论】:

这成功了!太感谢了。我误解了迭代器部分..

以上是关于如何减少字符串价格的对象数组的主要内容,如果未能解决你的问题,请参考以下文章

无法根据字符串值减少对象数组

JAVA 数组中的元素是对象,如何给对象排序

我将如何减少这个数组,以便每个对象中的对象被合并 javascript 但不知道键值名称

如何获取对象数组并减少它,以便组合重复对象键处的数据?

如何将数组内的对象和每个对象相乘,获取一个或多个键并减少它们的值?

Javascript通过包含搜索词的标签子数组过滤或减少每个JSON对象