首页 > 解决方案 > 计算多次搜索的出现次数

问题描述

我发现了这一点:计算列表(python)中搜索字符串的出现次数,与我需要的解决方案类似,但在 javascript 中。

我有对象数组:

data_items = [
    {
        "no": "1",
        "category": "design",
        "class": "low",
        "status": "open",
    },
    {
        "no": "2",
        "category": "permit",
        "class": "low",
        "status": "close",
    },
    {
        "no": "3",
        "category": "permit",
        "class": "high",
        "status": "open",
    },
    {
        "no": "4",
        "category": "quality",
        "class": "high",
        "status": "close",
    }

]
    

categoryList = [
    "design",
    "permit",
    "quality",
    "safety",
    "commercial"
]

我期望的是计算每个类别的出现次数包括空结果

countCategories = [
       { "design": 1 },
       { "permit": 2 },
       { "quality": 1 },
       { "safety": 0 },
       { "commercial": 0 }
]

以及如何获得结果的多维版本?如

 countCategories = [
        {
            open: [
                { "design": 1 },
                { "permit": 1 },
                { "quality": 0 },
                { "safety": 0 },
                { "commercial": 0 }
            ]
        }, {
            close: [
                { "design": 0 },
                { "permit": 1 },
                { "quality": 1 },
                { "safety": 0 },
                { "commercial": 0 }
            ]
        }
    ]

我一直在尝试通过减少和过滤来获得结果,但没有运气

感谢您的帮助。

标签: javascript

解决方案


您可以像这样计算所有类别,然后将其转换为您想要的任何格式:

const data_items = [{
    "no": "1",
    "category": "design",
    "class": "low",
    "status": "open",
  },
  {
    "no": "2",
    "category": "permit",
    "class": "low",
    "status": "close",
  },
  {
    "no": "3",
    "category": "permit",
    "class": "high",
    "status": "open",
  },
  {
    "no": "4",
    "category": "quality",
    "class": "high",
    "status": "close",
  }
]

const counting = new Map();
for (const item of data_items) {
  let count = counting.get(item.category) || 0;
  counting.set(item.category, count + 1);
}

// Convert it to the format you wanted (even though it's a weird one)
const countCategories = [];
for (const [key, value] of counting) {
  countCategories.push({
    [key]: value
  });
}

console.log(countCategories);
// [
//   {design: 1},
//   {permit: 2},
//   {quality: 1},
// ]


编辑:好像你在我写这个答案时添加了多维版本的要求。您可以重复使用上述代码并运行两次,但一次item.status === 'open'过滤为'close'. 这将为您提供两个结果数组,您可以将它们组合成一个多维版本。


推荐阅读