【问题标题】:How to find top recurring items in an array in javascript如何在javascript中查找数组中重复出现次数最多的项目
【发布时间】:2021-08-14 19:39:16
【问题描述】:

假设我有一个国家/地区名称字符串数组,即

const array = ["usa", "spain", "canada", "usa", "usa", "spain"]

我将如何遍历该数组并生成一个列表,该列表会增加该数组中最受欢迎的项目并仅列出前 3 个?

对于更多的上下文,实际用例是具有数十个甚至数百个不同国家/地区的数百个数组项。

我知道我可以遍历数组并创建一个新数组并在每次特定字符串再次出现时递增,但我只是好奇是否有人有更清洁和更通用的方法。

期望的输出:

usa: 3
spain: 2
canada: 1

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    您可以使用Array.reduce:

    const array = ["usa", "spain", "canada", "usa", "usa", "spain"]
    
    const obj = array.reduce((a, b) => { return a[b] = array.filter(e => e == b).length, a }, {})
    
    console.log(obj);

    【讨论】:

      【解决方案2】:

      这不是很漂亮,但我认为这是我能提供给你的最像 js 的 sn-p

      const array = ["usa", "spain", "canada", "usa", "usa", "spain"]
      
      const result = array.reduce((acc, cur) => {acc[cur] = (acc[cur] ?? 0) + 1; return acc}, {})
      
      console.log(result)

      当然,这可以通过更好的方式完成!

      【讨论】:

        【解决方案3】:

        简单但最直观的解决方案。

        const arr = ["usa", "spain", "canada", "usa", "usa", "spain"];
        let results = {};
        
        for (let country of arr) {
          results[country] = (results[country] || 0) + 1;
        }
        
        console.log(results);

        【讨论】:

          【解决方案4】:

          使用 reduce 获取每个项目的出现次数,然后通过对其值进行排序来获取前 3 个对象,然后使用 reduce 来获取前 3 个 key-value 对。

          const data = ["usa", "spain", "canada", "usa", "usa", "spain"];
          
          // Find the occurrences of each item
          const countMap = data.reduce((acc, curr) => {
            acc[curr] = (acc[curr] || 0) + 1;
            return acc;
          }, {});
          
          // Sort the object by values and get the top 3
          const sorted = Object.keys(countMap)
            .sort((a, b) => countMap[b] - countMap[a])
            .slice(0, 3);
          
          // Get the desired key-count pair
          const result = sorted.reduce(
            (acc, item) => ({
                              ...acc,
                              [item]: countMap[item]
                           })
          ,{});
          console.log(result);

          【讨论】:

            猜你喜欢
            • 2010-09-29
            • 2011-10-22
            • 2020-12-03
            • 1970-01-01
            • 2021-07-30
            • 2018-04-11
            • 2019-04-02
            • 2016-12-26
            • 2012-07-31
            相关资源
            最近更新 更多