Функция frequency
позволяет посчитать, сколько раз встречается каждый элемент массива. В базовой версии она принимает один аргумент — массив и возвращает массив пар, состоящих из значения и частоты. По умолчанию пары отсортированы по значению.
console.log(frequency(['Peter', 'Anna', 'Rose', 'Peter', 'Peter', 'Anna'])); // [["Anna", 2], ["Peter", 3], ["Rose", 1]] console.log(frequency([1, 10, 12, 2, 1, 10, 2, 2])); // [[1, 2], [2, 3], [10, 2], [12, 1]]
Дополнительно можно указать второй аргумент options
, который может содержать поля criteria
и compareTo
, оба необязательные.
С помощью опции criteria
можно группировать элементы и считать, сколько раз встречается каждая группа:
function parity(number) { return number % 2 === 0 ? 'even' : 'odd'; } console.log(frequency( [1, 2, 3, 4, 5, 6, 7], { criteria: parity }, )); // [["even", 3], ["odd", 4]]
А с помощью compareTo
можно отсортировать пары.
Например, функция alphabeticalCompare
сортирует пары по возрастанию ключа, сравнивая ключи как строки:
function alphabeticalCompare(value1, value2) { return String(value1).localeCompare(String(value2)) } console.log(frequency( [1, 10, 12, 2, 1, 10, 2, 2], { compareTo: alphabeticalCompare }, )); // [[1, 2], [10, 2], [12, 1], [2, 3]]
Функция сравнения также получает частоты элементов. Так frequencyCompare
сортирует по убыванию частоты:
function frequencyCompare(value1, value2, freq1, freq2) { return freq2 - freq1; } console.log(frequency( ['Peter', 'Anna', 'Rose', 'Peter', 'Peter', 'Anna'], { compareTo: frequencyCompare }, )); // [["Peter", 3], ["Anna", 2], ["Rose", 1]]
И, конечно, можно использовать обе опции одновременно:
function profession(person) { return person.profession; } const persons = [ {name: 'Peter', profession: 'teacher'}, {name: 'Max', profession: 'scientific'}, {name: 'Anna', profession: 'scientific'}, {name: 'Rose', profession: 'scientific'}, {name: 'Michael', profession: 'teacher'}, {name: 'Javier', profession: 'politician'}, ]; console.log(frequency( persons, { criteria: profession, compareTo: frequencyCompare, } )); //[["scientific", 3], ["teacher", 2], ["politician", 1]]