Мне не совсем понятно, о чем вы просите.
Но это может быть что-то вроде этого:
const maxRep = pipe (
countBy (identity),
toPairs,
map (zipObj(['color', 'rep'])),
reduce (maxBy (prop ('rep')), {rep: -Infinity}),
)
const params = [1, 2, 3, 4, 2, 3, 5, 2, 3, 2, 1, 1, 4, 5, 5, 3, 2, 5, 1, 5, 2]
console .log (
maxRep (params)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {pipe, countBy, identity, toPairs, map, zipObj, reduce, maxBy, prop} = R </script>
Мы начнем со списка значений, взятых из {1, 2, 3, 4, 5}
, происходящих в некотором случайном многократном порядке.
С countBy(identity)
мы изменяем исходный список на что-то вроде
{"1": 4, "2": 6, "3": 4, "4": 2, "5": 5}
со счетчиками, связанными с каждой записью.
toPairs
форматирует этот массив как
[["1", 4], ["2", 6], ["3", 4], ["4", 2], ["5", 5]]
(Вы также можете использовать Object.entries
здесь.)
Затем, вызывая map (zipObj (['color', 'rep']))
, мы превращаем это в
[{"color": "1", "rep": 4}, {"color": "2", "rep": 6}, ...]
Наконец, мы уменьшаем результат, используя maxBy (prop ('rep'))
, что выбирает тот с максимальным значением повторения. Для начального значения для вызова max мы создаем фиктивный объект {rep: -Infinity}
, который будет сравнивать меньше, чем любой в вашем списке.
Если вы хотите также сохранить эту окончательную промежуточную структуру, вы можете переименовать эту функцию на makeReps
, сбросив последнюю функцию в конвейере, а затем сделав из нее новую maxRep
.
Затем вы можете вызвать
const reps = makeResps (params)
const maxVal = maxRep (reps)
и использовать обе.
Но все это предполагает, что вам нужно значение со свойствами color
и rep
. Если вам просто нужен подсчет, то другие решения, которые уже здесь, справятся с этим.