Функциональный JavaScriptГруппировкаhard

Super Power Frequency Function

Функция 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; } var 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]]