Используйте _.flow()
, чтобы создать функцию, которая группирует по дням, а затем отображает значения каждого дня и группирует их по часам:
const { flow, groupBy, mapValues } = _
const fn = flow(
arr => groupBy(arr, v => moment(v.date).startOf('day').format("MMM Do YY")),
groups => mapValues(groups, g => _.groupBy(g, v =>
moment(v.date).startOf('hour').format("LT")
))
)
const arr = [{"date":1555318593445,"name":"john","country":"AU","text":"Hey"},{"date":155531859300,"name":"jake","country":"US","text":"Hey"},{"date":1555316593445,"name":"jeff","country":"US","text":"Hey"},{"date":1555316593345,"name":"jared","country":"US","text":"Hey"},{"date":155531659400,"name":"jane","country":"UK","text":"Hey"}]
const result = fn(arr)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
И более краткая версия lodash / fp:
const { flow, groupBy, mapValues } = _
const fn = flow(
groupBy(v => moment(v.date).startOf('day').format("MMM Do YY")),
mapValues(_.groupBy(v => moment(v.date).startOf('hour').format("LT")))
)
const arr = [{"date":1555318593445,"name":"john","country":"AU","text":"Hey"},{"date":155531859300,"name":"jake","country":"US","text":"Hey"},{"date":1555316593445,"name":"jeff","country":"US","text":"Hey"},{"date":1555316593345,"name":"jared","country":"US","text":"Hey"},{"date":155531659400,"name":"jane","country":"UK","text":"Hey"}]
const result = fn(arr)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
Комментарии Q & A:
Чем поток отличается от цепочки?
Поток генерирует функцию, которая выполняет код впоследовательность и передает результаты одного вызова функции в следующий.Цепочка lodash запускает код, но пытается выполнить ленивую оценку и объединяет несколько вызовов в один, что означает, что цепочка .map.filter будет повторять массив только один раз.
Однако лень имеет цену, вам нужно импортировать весь модуль lodash, чтобы он работал.При использовании потока вы можете импортировать только те функции, которые вам нужны.
почему mapvalues был вторым шагом?
Результатом 1-й группы является объект {date: {}, date:{}), и вам нужно сгруппировать значения каждого объекта отдельно.Для этого вам необходимо отобразить значения каждой даты и сгруппировать их по часам.