Итерируйте по массиву и возвращайте, сколько из каждого присутствует в jquery - PullRequest
0 голосов
/ 19 апреля 2011

Итак, у меня есть массив.Внутри массива есть строковые значения, которые могут меняться каждый раз:

var array = ['1','2','3','4','5'];

или иногда:

var array = ['1','4','3','4','4'];

или даже:

var array = ['1','3','3','4','4'];

Как мне поступитьперебирая этот массив, выясняя, какое значение присутствует больше всего, и затем отображая его.Кроме того, как мне сделать так, чтобы было еще умнее понять, что иногда существует связь между двумя значениями, как в последнем массиве выше, и затем отображать информацию, уведомляющую меня о том, что значения «3» и «4» связаны... Или если нет значения, которое встречается более одного раза, таким образом отображаются все значения.Мысли?

Ответы [ 3 ]

1 голос
/ 19 апреля 2011
function findMostFrequent(array) {
    // {
    //    "valueInTheArray": numberOfOccurances,
    //    ...
    // }
    var data = {};
    // for each value in the array increment the number of 
    // occurences for that value. the or clause defaults it to 0.
    $.each(array, function(i, val) {
        data[val] = data[val]++ || 1;
    });
    var answer = null;
    // for each value if the occurances is higher then to the counter.
    // then set that as the counter.
    $.each(data, function(key, val) {
         if (val > data[answer]) answer = key;
    }
    return answer;
}

Вам нужно две петли.Один, чтобы посчитать, сколько раз каждое значение произошло.И один, чтобы найти, который произошел больше всего.

По желанию, если вы хотите обработать несколько высоких значений, замените второй цикл этим.

var answer = [null];
// for each value if the occurances is equal then add it to the array
// else if the occurance is higher then the current highest occurance.
// then set that as the current array of values.
$.each(data, function(key, val) {
     if (val === data[answer[0]]) {
          answer.push(key);
     } else if (val > data[answer[0]]) {
          answer = [key];
     }
}
return answer;
0 голосов
/ 19 апреля 2011

Попробуйте это:

var array = ['1','2','3', '3','4','5', '3', '4', '5', '5'],
l = array.length,
col = {},
current,
max = {cnt:0, values:[]};
while(l--){
  current = array[l];
  col[current] = (col[current] || 0) + 1;
  if(col[current] > max.cnt){
    max = {cnt:col[current], values: [current]};
  }else if(col[current] === max.cnt){
    max.values.push(current);
  }
}
console.log(
  max.cnt === 1 ? 
    'they are all different' : 
    max.values.join(',') + ' occured ' + max.cnt + ' times'
);
0 голосов
/ 19 апреля 2011

Вы, вероятно, хотите использовать что-то вроде этого:

var arr = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4];
var counts = {};

for(var i = 0; i< arr.length; i++) {
    var num = arr[i];
    counts[num] = counts[num] ? counts[num]+1 : 1;
}

Теперь у вас будет объект, в котором есть число всех членов массива.

console.log(counts[5]); // logs '3'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...