[英]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
以跟蹤值及其出現,第二個元素是跟蹤maxCount
和maxValue
,根據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 的答案中的方法,該方法使用名為maxCount
和max
的兩個變量
這里的神奇詞是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.