it-roy-ru.com

Как посчитать количество вхождений каждого элемента в массиве?

У меня есть массив следующим образом,

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

нет необходимости использовать 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

Пример скрипки

43
fcalderan

Я думаю, что это самый простой способ подсчета вхождений с одинаковым значением в массиве.

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

если вам не нужно решение, которое требует библиотеки, и вам не нужно поддерживать устаревший 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 );
3
code_monk

Если вы используете библиотеку Sugar это просто:

arr.count('ab');

ДЕМО

Смотрите: API подсчета массива .

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

вышеприведенная функция поможет вам посчитать количество одинаковых строк в массиве.

1
meadlai

Попробуйте $ .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
Jackwin tung

Может ли это быть тем, что вы пытаетесь сделать?

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

этот код будет подсчитывать вхождения каждой строки в массиве и сохранять результаты в resultsArray

0
codebox
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
Prashant_M