Рамда также имеет другую функцию под названием R.reduceBy
, которая обеспечивает что-то среднее между reduce
и groupBy
, позволяя вам складывать значения с помощью соответствующих ключей вместе.
Таким образом, вы можете создать тип данных, подобный следующему, который подсчитывает значения до усреднения.
const Avg = (count, val) => ({ count, val })
Avg.of = val => Avg(1, val)
Avg.concat = (a, b) => Avg(a.count + b.count, a.val + b.val)
Avg.getAverage = ({ count, val }) => val / count
Avg.empty = Avg(0, 0)
Затем объедините их вместе, используя R.reduceBy
.
const avgCities = R.reduceBy(
(avg, a) => Avg.concat(avg, Avg.of(a.other.playtime)),
Avg.empty,
x => x.city
)
Затем вытяните средние значения из Avg
в форму конечных объектов.
const buildAvg = R.applySpec({
count: x => x.count,
avg_play_time: Avg.getAverage
})
И, наконец, соединяем их вместе, сопоставляя buildAvg
значения в объекте.
const fn = R.pipe(avgCities, R.map(buildAvg))
fn(someObj)