Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

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

#javascript


Есть массив: [1, 3, 4, 1, 1, 3, 4, 5].

Числа могут быть различные. Мне нужно посчитать количество повторений каждого числа.
То есть, например, для вышеуказанного массива:

число 1 == 3 раза
число 3 == 2 раза
число 4 == 2 раза
число 5 == 1 раз

    


Ответы

Ответ 1



Можно воспользоваться методом reduce document.write('
', JSON.stringify(
  [1, 3, 4, 1, 1, 3, 4, 5].reduce((acc, el) => {
    acc[el] = (acc[el] || 0) + 1;
    return acc;
  }, {}), null, 2), '
'); Вариант без стрелочных функций var result = [1, 3, 4, 1, 1, 3, 4, 5].reduce(function(acc, el) { acc[el] = (acc[el] || 0) + 1; return acc; }, {}); document.write('
', JSON.stringify(
  result, null, 2), '
');

Ответ 2



Самое простое решение: var arr = [1, 3, 4, 1, 1, 3, 4, 5]; var result = {}; for (var i = 0; i < arr.length; ++i) { var a = arr[i]; if (result[a] != undefined) ++result[a]; else result[a] = 1; } for (var key in result) document.write('число ' + key + ' == ' + result[key] + ' раз(а)
'); Можно использовать метод forEach для массивов: var arr = [1, 3, 4, 1, 1, 3, 4, 5]; var result = {}; arr.forEach(function(a){ if (result[a] != undefined) ++result[a]; else result[a] = 1; }); for (var key in result) document.write('число ' + key + ' == ' + result[key] + ' раз(а)
'); Применив небольшую хитрость, можно записать ещё короче: var arr = [1, 3, 4, 1, 1, 3, 4, 5]; var result = {}; arr.forEach(function(a){ result[a] = result[a] + 1 || 1; }); for (var key in result) document.write('число ' + key + ' == ' + result[key] + ' раз(а)
');

Ответ 3



Эффективный алгоритм: сортируем числа, проходим по массиву, считаем повторения. В отличии от тупого перебора(прошлись по каждому числу и посчитали его количество) который работает за O(N^2) такой алгоритм работает за O(N log N). Хотя автору темы вряд-ли нужен эффективный алгоритм, но кому-то может пригодиться.

Ответ 4



Самый простой и верный вариант использовать метод .filter [1,2,3,4,4,4,5,4,1,5,4].filter(item => item === 4).length // 5

Комментариев нет:

Отправить комментарий