javascript - 计算对象属性的唯一实例并根据其他属性进行计数
问题描述
我需要计算 DishName 在对象数组中出现的次数,同时还要计算哪些已煮熟,哪些未煮熟,值 1 表示煮熟,0 表示未煮熟。所以以下内容:
[{
"Cooked": 1,
"DishName": "85. Tikka Masala"
},
{
"Cooked": 0,
"DishName": "89. Lamb Rezalla"
},
{
"Cooked": 1,
"DishName": "85. King Prawn Masala"
},
{
"Cooked": 0,
"DishName": "85. Tikka Masala"
}]
应该返回:
菜名——总量——熟——生
- 蒂卡马萨拉 -- 2 -- 1 -- 1
- 羊肉雷扎拉 -- 1 -- 0 -- 1
- 大虾马沙拉 -- 1 -- 1 -- 0
解决方案
这是reduce的典型案例。简化为以菜肴名称为关键字的对象。对于每个,记录总计数和其他条件(煮熟/未煮熟)的计数。通过映射对象整体将结果转换为字符串数组。
let orders = [{
"Cooked": 1,
"DishName": "85. Tikka Masala"
},
{
"Cooked": 0,
"DishName": "89. Lamb Rezalla"
},
{
"Cooked": 1,
"DishName": "85. King Prawn Masala"
},
{
"Cooked": 0,
"DishName": "85. Tikka Masala"
}];
let summary = orders.reduce((acc, order) => {
if (!acc[order.DishName]) acc[order.DishName] = { count: 0, cooked: 0, uncooked: 0 };
acc[order.DishName].count++;
order.Cooked ? acc[order.DishName].cooked++ : acc[order.DishName].uncooked++;
return acc;
}, {});
// this produces:
// { "85. Tikka Masala" : { count: 2, cooked: 1, uncooked: 1 }}, ...
// formatted just like the OP...
let printReady = Object.entries(summary).map(([name, s]) => `${name} -- ${s.count} -- ${s.cooked} -- ${s.uncooked}`);
console.log(printReady);
推荐阅读
- javascript - 错误:请求中指定的回复 URL 与为应用程序配置的回复 URL 不匹配
- c# - 如何告诉 MVVMLight 创建一个新的视图模型?
- django - Django Queryset 多对多
- android - 如何将数组中的值填充到 SQLite 数据库中
- php - ["read"] 没有值
- python - 在 python 中处理长整数除法
- html - 在安全网站上通过 MSXML 提取 cookie 时遇到问题
- git - Git:为什么我的工作树创建后消失了?
- angular - Angular 5 - 在新窗口中打开带有 CSS 类的链接
- python - 元素不可点击,因为另一个元素遮住了它