2016-11-03 5 views
1

配列値の出現頻度が最も高くなるようにしようとしていて、等しい出現数がある場合は、最初に選択した等しい出現数を取得する必要があります。配列内の最も出現したもの、または最初に選択されたもの

例:私は私の公正な取り分を行ってきたa

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

この場合、私は、私も取得する必要があります。この場合、a

var array = ['75', '100', 'a', 'b', 'b', '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))]; 
} 

そして、あなたも広がりオペレータが許可される(NodeJSのV5とアップ、クローム54)あなたはMath.max(...map)ためMath.max.apply(null, map)を置き換えることができている場所にいる場合は!

-1

EDITED:new 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

'それは今それがないこの基準 – Cristy

+0

を満たしていないoccurrences.'私は同じの最初の選択された値を取得する必要があり、新しいコード(編集済み) – pmirnd

+0

なぜ-1を確認してください。 ..それは働く – pmirnd

1

はこのお試しください:それはGet the element with the highest occurrence in an arrayのように基本的に同じ溶液

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']));

を、最後の行だけが重要である:代わりに返すので最後のmaxElement、それはの最初の要素を返します同じcountmaxCountと同じマップです。

+0

助けてくれてありがとう、ありがとう。彼のコードがわかりやすいので@ダンバンハムの答えを受け入れました。 – Jrn

0

この提案に加えて、この提案はO(n)の複雑さを持っています - 単一のループのみ。

基本的に、2つのオブジェクト、1つのハッシュテーブルと1つの結果セットがあり、それらは繰り返しによって維持されます。

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']));

関連する問題