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

IT技术 javascript jquery arrays
2021-01-24 07:02:39

我有一个数组如下,

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(','));
6个回答

不需要使用 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

示例小提琴

您还可以使用一个很好的速记,例如obj[arr[i]] = (obj[arr[i]] || 0) + 1. 只要您不关心数据类型,您的解决方案就可以工作,但是如果您想区分"2"2,您还必须对该信息进行编码(只是说)。
2021-03-14 07:02:39
有人可以解释这是如何工作的吗?
2021-03-16 07:02:39
不知道这仍然是如何工作的。我认为reduce是一个总和,但是这个reduce初始化为一个空对象,在哪里检查数组项是否匹配
2021-04-02 07:02:39
+1 用于添加小提琴来演示您的答案。为什么投反对票?
2021-04-06 07:02:39
速记的好点:)
2021-04-11 07:02:39

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

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

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

试试$.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
var result = {};
function count(input){
  var tmp = 0;
  if(result.hasOwnProperty(input)){
     tmp = result[input];
     result[input]=tmp+1;
  }else{
    result[input]=1;
  }
}

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