首页 > 解决方案 > 计算对象属性的唯一实例并根据其他属性进行计数

问题描述

我需要计算 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"
}]

应该返回:


菜名——总量——熟——生


  1. 蒂卡马萨拉 -- 2 -- 1 -- 1
  2. 羊肉雷扎拉 -- 1 -- 0 -- 1
  3. 大虾马沙拉 -- 1 -- 1 -- 0

标签: javascriptarraysobject

解决方案


这是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);


推荐阅读