簡體   English   中英

用一個循環查找 JS 數組的最頻繁項

[英]Find most frequent item of a JS array with one loop

我創建了一個 function ,它找到一個帶有兩個 for 循環的 JS 數組中最頻繁的項目,並顯示該項目以及數組中有多少次。 我怎樣才能用一個循環來做到這一點?

var arr=[3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3];

//ta = times appeared / m = max / arrchar = array character
var ta = 1;
var m = 0;
var arrchar;

for (var i=0; i<arr.length; i++)
{
        for (var j=i; j<arr.length; j++)
        {
                if (arr[i] == arr[j])
                 m++;
                if (ta<m)
                {
                  ta=m; 
                  arrchar = arr[i];
                }
        }
        m=0;
}
console.log(arrchar+"("+ta +")") ;

最簡單的方法是計算每個元素的出現次數,按降序排列並獲取第一個值

 var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3]; let findMostFrequent = (arr) => { return [...arr.reduce((op, inp) => { op.set(inp, (op.get(inp) || 0) + 1) return op }, new Map())].sort((a, b) => b[1] - a[1])[0][0] } console.log(findMostFrequent(arr))


單循環版本

您可以在 reduce 方法中使用數組作為累加器,這里第一個元素是Map以跟蹤值及其出現,第二個元素是跟蹤maxCountmaxValue ,根據Map中的值更改這些值

 var arr = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3]; let findMostFrequent = (arr) => { return arr.reduce((op, inp) => { op[0].set(inp, (op[0].get(inp) || 0) + 1) if(op[0].get(inp) > op[1].maxCount){ op[1].maxCount = op[0].get(inp) op[1].maxValue = inp } return op }, [new Map(), {maxCount:1, maxValue: arr[0]}])[1].maxValue } console.log(findMostFrequent(arr))

這可以通過使用兩個單獨的變量和僅 Map 作為累加器來進一步簡化,因此您無需每次都按索引訪問值,請查看 Jhon 的答案中的方法,該方法使用名為maxCountmax的兩個變量

這里的神奇詞是hashtable 如果將每個項目的 Map 創建為一個計數,則可以查找增加並將計數存儲在 O(1) 中,還可以同時存儲最大計數:

 let max = null, maxCount = -Infinity;
 const counts = new Map();

 for(const el of arr) {
   const count = (counts.get(el) || 0) + 1;
   counts.set(el, count);
   if(count > maxCount) {
      maxCount = count;
      max = el;
   }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM