如何计算数组中每个元素出现的次数?

29

我有一个如下的数组:

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(','));

2
"jQuery 数组" 这样的东西不存在。 - Felix Kling
1
https://dev59.com/_VbTa4cB1Zd3GeqP7hUo - timmalos
9个回答

58

不需要使用jQuery来完成这个任务—此示例将在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

这是一个示例


你也可以使用Array.reduce来获得相同的结果并避免使用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

示例演示


+1 为您的回答添加一个 fiddle。为什么会有踩票? - starbeamrainbowlabs
2
你也可以使用简洁的写法,例如 obj[arr[i]] = (obj[arr[i]] || 0) + 1。只要你不关心数据类型,这个解决方案就能够正常工作,但是如果你想区分 "2"2,你也需要对这些信息进行编码(仅供参考)。 - Felix Kling
缩写的好处不错 :) - Fabrizio Calderan
1
有人可以解释一下这是如何工作的吗? - uranibaba
1
还不确定这个如何工作。 我以为reduce是一个求和函数,但是这个reduce将其初始化为空对象,那么在哪里检查数组项是否匹配呢? - Ricky-U
我会很感激如果有人能够逐行解释“reduce”函数是如何实现这一点的。 - Delice

7

我认为这是在数组中计算相同值出现次数的最简单方法。

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

6

如果您不想使用需要库的解决方案,并且不必支持遗留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;
});

这个使用短路逻辑来测试条件和设置值。我认为这是一种相当简洁和易读的javascript写法。

console.log( report );

2

请尝试使用$.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

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

上述函数将帮助您计算数组中相同字符串的数量。


1

0
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]);
} 

0

这可能是你想要做的吗?

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

这段代码将计算数组中每个字符串的出现次数,并将结果存储在resultsArray中。


0

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/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接