Вот подход Рамды:
const transform = pipe (
groupBy (path (['times', 0, 'starting_time'])),
values,
map (applySpec ({
label: pipe (pluck ('label'), join (', ')),
value: length
}))
)
const data = [{"isIncluded": true, "label": "Argentina", "times": [{"ending_time": 1581693600000, "starting_time": 1578996000000, "text": ""}]}, {"isIncluded": false, "label": "Chile", "times": [{"ending_time": 1589945040000, "starting_time": 1578996000000, "text": ""}]}, {"isIncluded": true, "label": "United States of America", "times": [{"ending_time": 1584674640000, "starting_time": 1578999600000, "text": ""}]}]
console .log (transform (data))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script>const {pipe, groupBy, path, values, map, applySpec, pluck, join, length} = R</script>
Я сделал предположение, что тот факт, что в некоторых датах отсутствовали окончательные "Z"
, был просто опечаткой. Если у некоторых предполагается, что они есть, а у других нет, у вас есть довольно странные данные, и они не соответствуют выводу, который вы представляете, если только вы не живете в месте с таким часовым поясом.
После этого это довольно простой код для Рамды. groupBy
принимает функцию, которая дает вам канонический ключ для элемента. Здесь мы передаем результат path
. path
принимает массив строк или целых чисел и возвращает вам функцию, которая будет возвращать значение по этому пути входного объекта или неопределенную, если какой-либо из узлов не существует. groupBy (fn)
возвращает объект с массивом для каждого из найденных канонических ключей, с элементами во входном массиве, разбитых на эти массивы.
Мы вызываем values
для этого результата, который немного больше, чем ссылка на Object.values
; он возвращает массив массивов.
В каждом из этих внешних массивов (через map
) мы вызываем applySpec
, который принимает отображение ключей на функции, создавая объект с теми ключами, значения которых результат применения соответствующей функции к вашему входному значению. Для value
мы просто возвращаем length
базового массива, а для label
мы извлекаем label
записей из каждого объекта, а затем соединяем их с ", "
.
в ответах. здесь я часто показываю, как современный JS делает некоторые функции Ramda менее привлекательными. Хотя я мог бы сделать это здесь, комбинируя некоторые простые ES6 + -альтернативы с applySpec
и values
, используя простые лямбды для length
и заменяя pipe (pluck ('label'), join (', ')
чем-то вроде arr => arr .map (item => item .label) .join (', ')
. Но я не беспокоюсь, так как нам все равно придется написать одноразовый эквивалент groupBy
. Хотя это не сложно, я думаю, что код будет значительно длиннее, чем этот. И я не вижу, чтобы это что-то получало. Конечно, я бы поступил так, если бы я еще не использовал Рамду в своем проекте, но в целом это хорошее время для использования упрощений Рамды.