如何计算数组中每个项目的出现次数?

我有一个数组如下,

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

预期结果

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

试过如下,

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

这个任务不需要使用jQuery – 这个例子将build立一个对象,其中包含数组中每个不同元素的发生量

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

示例小提琴: http : //jsfiddle.net/8Gt6V/

我认为这是最简单的方法如何计数相同的数值发生。

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

如果您使用的是Sugar库,只需要:

 arr.count('ab'); 

DEMO

请参阅: arrays计数API 。

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

上面的函数将帮助你计算一个数组中相同的string的数量。

如果你不想要一个需要库的解决scheme,而不必支持遗留的javascript:

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

或者,如果你想用jQuery来做:

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

这使用短路逻辑来testing条件和设定值。 我认为这是一个相当简洁和可读的方式来做JavaScript。

 console.log( report ); 

试试$ .grep

例:

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

如果支持ie8是没有必要的。

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

难道这就是你想要做的?

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

此代码将计算数组中每个string的出现次数并将结果存储在resultsArray

 var arr = ['ab','pq','mn','ab','mn','ab'] function getCount(arr,val) { var ob={}; var len=arr.length; for(var k=0;k<len;k++) { if(ob.hasOwnProperty(arr[k])) { ob[arr[k]]++; continue; } ob[arr[k]]=1; } return ob[val]; } //run test alert(getCount(arr,'ab'));//3 

演示: http : //jsfiddle.net/dmx4y/2/

 var arr = ['ab','pq','mn','ab','mn','ab']; var result = { }; for(i=0;i<arr.length;++i) { if(!result[arr[i]]) result[arr[i]]=0; ++result[arr[i]]; } for (var i in result){ console.log(i+":"+result[i]); }