Как подсчитать количество вхождений каждого элемента в массиве?
У меня есть массив следующим образом:
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(','));
Ответы
Ответ 1
нет необходимости использовать 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
Пример скрипки
Ответ 2
Я думаю, что это самый простой способ подсчета вхождений с одинаковым значением в массиве.
var a = [true, false, false, false];
a.filter(function(value){
return value === false;
}).length
Ответ 3
Если вы используете библиотеку Sugar, это просто:
arr.count('ab');
DEMO
См. API API массива.
Ответ 4
если вы не хотите решение, требующее библиотеки, и не нужно поддерживать устаревший 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 );
Ответ 5
var result = {};
function count(input){
var tmp = 0;
if(result.hasOwnProperty(input)){
tmp = result[input];
result[input]=tmp+1;
}else{
result[input]=1;
}
}
выше функция поможет вам подсчитать число одной и той же строки в массиве.
Ответ 6
Попробуйте $.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
Ответ 7
Может быть, это то, что вы пытаетесь сделать?
$.each(arr, function(index, value) {
if (!resultSummary[value]){
resultSummary[value] = 0;
}
resultSummary[value] += 1;
});
этот код будет считать вхождения каждой строки в массиве и сохранять результаты в resultsArray
Ответ 8
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
- 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/
Ответ 9
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]);
}