2016-11-03 73 views
1

我試圖獲得數組值的最高出現次數,如果出現相同的出現次數,我應該得到第一次選擇的相同出現次數的值。陣列或第一次選擇的最高發生率

例子:

var array = ['25', '50', 'a', 'a', 'b', 'c']

在這種情況下,我應該得到a

var array = ['75', '100', 'a', 'b', 'b', 'a']

在這種情況下,我也應該得到a

我已經做了我分內搜索,並找到了一些有用的職位,這些考試PLE:

不知怎的,我似乎無法修改這些示例以我的情況下工作。

現在我正在使用下面的代碼,但它返回的是最後一次選擇的等號,而不是第一個。 (信用https://stackoverflow.com/users/1238344/emissary

function mostFrequent(array){ 
    return array.sort(function(a,b){ 
    return array.filter(function(v){ return v===a }).length 
     - array.filter(function(v){ return v===b }).length 
    }).pop(); 
} 

任何幫助,這是值得歡迎的。

回答

2

你可以使用這樣的事情:

function mostFrequent(array) { 
    var map = array.map(function(a) { 
     return array.filter(function(b) { 
      return a === b; 
     }).length; 
    }); 

    return array[map.indexOf(Math.max.apply(null, map))]; 
} 

首先,它創建了一個地圖的所有值的出現。接下來只需查詢Math.max哪一個是最高的。請檢查indexOf以獲取具有最高出現次數的第一個值,並返回原始數組中該索引的值。

ES2015

如果ES2015是一個選項,您可以使用這個選項。這是更少的代碼。

function mostFrequent(array) { 
    let map = array.map((a) => array.filter((b) => a === b).length); 

    return array[map.indexOf(Math.max.apply(null, map))]; 
} 

如果你在甚至蔓延允許操作員(V5的NodeJS和起來,Chrome的54),你可以替換爲Math.max.apply(null, map)一個Math.max(...map)地方是!

-1

編輯:新jsfiddle。

像這樣:https://jsfiddle.net/Ldohv125/1/

var array = ['75', '100', 'b', 'b', 'a', 'a']; 
var mf = 1; 
var m = 0; 
var item; 
for (var i=0; i<array.length; i++){ 
    for (var j=i; j<array.length; j++) { 
     if (array[i] == array[j]) 
      m++; 
     if (mf<m){ 
      mf=m; 
      item = array[i]; 
     } 
    } 
    m=0; 
} 
alert(item); 
+0

'我應該得到平等的第一個選定值occurrences.'它不符合這個標準,現在 – Cristy

+0

它,檢查新的代碼(編輯) – pmirnd

+0

爲什麼-1。 ..它的工作 – pmirnd

1

試試這個:

const mostFrequent = arr => { 
 
    let maxCount = 0; 
 
    const occurrences = new Map(); 
 
    arr.forEach(x => { 
 
    const count = occurrences.has(x) ? occurrences.get(x) + 1 : 1; 
 
    occurrences.set(x, count); 
 
    maxCount = count > maxCount ? count : maxCount; 
 
    }); 
 
    return Array.from(occurrences).find(([element, count]) => count === maxCount)[0]; 
 
}; 
 

 
console.log(mostFrequent(['25', '50', 'a', 'a', 'b', 'c'])); 
 
console.log(mostFrequent(['75', '100', 'a', 'b', 'b', 'a']));

它基本上是相同的解決方案中Get the element with the highest occurrence in an array,只有最後一行是顯著:而不是返回最後的maxElement,它返回中的第一個元素的地圖與maxCount具有相同的count

+0

感謝您的幫助,感謝。我接受了@daanvanham的答案,因爲他的代碼對我來說更容易理解。 – Jrn

0

除了給定的解決方案之外,該提議的複雜度爲O(n) - 只有一個循環。

基本上有兩種對象,一個哈希表和一個結果集,它們通過迭代維持。

function getValue(array) { 
 
    var count = 0, 
 
     index = -1; 
 

 
    array.forEach(function (a, i) { 
 
     this[a] = this[a] || { count: 0, index: i }; 
 
     this[a].count++; 
 
     if (this[a].count > count) { 
 
      count = this[a].count; 
 
      index = this[a].index; 
 
      return; 
 
     } 
 
     if (this[a].count === count && this[a].index < index) { 
 
      index = this[a].index; 
 
     } 
 
    }, Object.create(null)); 
 
    return array[index]; 
 
} 
 

 
console.log(getValue(['25', '50', 'a', 'a', 'b', 'c'])); 
 
console.log(getValue(['25', '50', 'a', 'b', 'b', 'a', 'c']));

相關問題