2014-12-27 5 views
1

Предположим, у меня есть массив с элементами n, некоторые из которых могут встречаться более одного раза.Выберите верхнюю часть наиболее повторяющихся элементов из массива в Javascript

Я хочу выбрать верхние m элементы, которые чаще всего встречаются в этом массиве.

Может ли кто-нибудь помочь мне с этим?

Например, массив [1, 3, 2, 3, 5, 2, 2, 3, 6, 8, 9] с элементами n=11. Если я хочу выбрать верхние m=2 из них, это будет 2 и 3.

Что было бы лучшим сценарием для этого?

+1

Сделать массив объектов '{value: n, count: c}'. Сортируйте их по 'count'. Затем возьмите первые элементы 'm'. – Barmar

+2

Что делать, если результат привязан больше, чем номер, который вы просили? (Например, m = 3 для вашего массива образцов.) – nnnnnn

ответ

1

решение:

var arr = [1,2,3,41,11,2,3,4,1]; 
var sorted = []; 

for (var i = 0; i < arr.length; i++) { 
    var index = -1; 

    for (var j = 0; j < sorted.length; j++) { 
     if (sorted[j].val == arr[i]) index = j; 
    } 

    if (index == -1) { 
     sorted.push({val: arr[i], count: 1}) 
    } 

    else { 
     sorted[index].count++; 
    } 

} 

console.log(sorted.sort(function(a,b){ 

if (a.count > b.count) return -1; 

if (a.count < b.count) return 1 

    return 0 

})[0]) 

FIDDLE

+0

спасибо, я попробую. для чего «элемент»? –

+0

Ошибка ошибки при депонировании @deemeetree. – giannisf

2

Вы можете создать временный объект для хранения вхождений как key: count. Затем используйте массив, возвращенный Object.keys, для сортировки значений объекта. Затем slice последние «n» элементы из этого массива в .reverse() порядке.

Вот функция полезности примера, чтобы получить верхних «п» макс вхождений. Примечание: Как @n , указанный выше в комментариях, это игнорирует связи.

Demo скрипку: http://jsfiddle.net/abhitalks/s43k6vsq/

Отрывок:

var data1 = [1, 3, 2, 3, 5, 2, 2, 3, 6, 8, 9], 
 
    data2 = [4, 4, 4, 2, 2, 1, 5, 5, 8, 8, 8, 8, 3], 
 
    data3 = [3, 23, 23, 45, 54, 54, 54]; 
 

 

 
// Function parameters = Data Array and top "n" elements to find 
 
function getMax(data, n) { 
 
    var tmp = {}, tops = []; 
 
    
 
    // Create object with count of occurances of each array element 
 
    data.forEach(function(item) { 
 
     tmp[item] = tmp[item] ? tmp[item]+1 : 1; 
 
    }); 
 
    
 
    // Create an array of the sorted object properties 
 
    tops = Object.keys(tmp).sort(function(a, b) { return tmp[a] - tmp[b] }); 
 
    
 
    // Return last n elements in reverse order 
 
    return tops.slice(-(n)).reverse(); 
 
} 
 

 
// Test with sample data and top "n" 
 
snippet.log(getMax(data1, 2)); 
 
snippet.log(getMax(data2, 3)); 
 
snippet.log(getMax(data3, 1));
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

* Использование сценария по TJ Crowder е или console.log для snippet.log. См. Здесь: https://meta.stackexchange.com/a/242144/230147 и здесь: https://meta.stackexchange.com/a/242144/134069

Смежные вопросы