Como contar o número de ocorrências de cada item em uma matriz?

Eu tenho uma matriz como segue,

var arr = ['ab','pq','mn','ab','mn','ab'] 

Resultado esperado

 arr['ab'] = 3 arr['pq'] = 1 arr['mn'] = 2 

Tentei como segue,

 $.each(arr, function (index, value) { if (value) arr[value] = (resultSummary[value]) ? arr[value] + 1 : 1; }); console.log(arr.join(',')); 

não há necessidade de usar jQuery para esta tarefa – este exemplo irá construir um object com a quantidade de ocorrências de cada elemento diferente na matriz em O(n)

 var occurrences = { }; for (var i = 0, j = arr.length; i < j; i++) { occurrences[arr[i]] = (occurrences[arr[i]] || 0) + 1; } console.log(occurrences); // {ab: 3, pq: 1, mn: 2} console.log(occurrences['mn']); // 2 

Exemplo de violino


Você também pode usar Array.reduce para obter o mesmo resultado e evitar um for-loop

 var occurrences = arr.reduce(function(obj, item) { obj[item] = (obj[item] || 0) + 1; return obj; }, {}); console.log(occurrences); // {ab: 3, pq: 1, mn: 2} console.log(occurrences['mn']); // 2 

Exemplo de violino

Acho que esta é a maneira mais simples de contar ocorrências com o mesmo valor em array.

 var a = [true, false, false, false]; a.filter(function(value){ return value === false; }).length 

se você não quiser uma solução que exija uma biblioteca e não tenha que suportar o javascript legado:

 var report = {}; arr.forEach(function(el){ report[el] = report[el] + 1 || 1; }); 

Ou se você quiser fazer isso usando jQuery:

 var report = {}; $.each(arr,function(i,el){ report[el] = report[el] + 1 || 1; }); 

Isso usa a lógica de curto-circuito para testar condições e definir valores. Eu acho que é uma maneira bastante concisa e legível de fazer javascript.

 console.log( report ); 

Se você está usando a biblioteca Sugar , é só:

 arr.count('ab'); 

DEMO

Consulte: API de contagem de matrizes .

 var result = {}; function count(input){ var tmp = 0; if(result.hasOwnProperty(input)){ tmp = result[input]; result[input]=tmp+1; }else{ result[input]=1; } } 

A function acima ajudará você a contar o número da mesma string em uma Matriz.

Experimente $ .grep

Exemplo:

 var arr = ['ab','pq','mn','ab','mn','ab'] jQuery.grep(arr, function(a){ return a == 'ab' }).length // 3 

se o suporte a ie8 não for necessário.

 ['ab','pq','mn','ab','mn','ab'].filter(function(value){ return value == 'ab' }).length // 3 

Isso poderia ser o que você está tentando fazer?

 $.each(arr, function(index, value) { if (!resultSummary[value]){ resultSummary[value] = 0; } resultSummary[value] += 1; }); 

esse código contará as ocorrências de cada string na matriz e armazenará os resultados em resultsArray

 var arr = ['ab','pq','mn','ab','mn','ab'] function getCount(arr,val) { var ob={}; var len=arr.length; for(var k=0;k 

Demonstração: http://jsfiddle.net/dmx4y/2/

 var arr = ['ab','pq','mn','ab','mn','ab']; var result = { }; for(i=0;i