Используйте ramda `sequence`, чтобы пройти словарь

Как я могу использовать рамды sequence пройти словарь?

Учитывая следующий словарь

cars = {color: ['yellow', 'red'], year: [2017], model: ['coup', 'sedan']}

Я хотел бы получить пройденный результат

all_cars = [
    {color: 'yellow', year: 2017, model: 'coup'},
    {color: 'yellow', year: 2017, model: 'sedan'},
    {color: 'red', year: 2017, model: 'coup'},
    {color: 'red', year: 2017, model: 'sedan'}
]

С помощью R.sequence приводит к списку пустого списка

R.sequence(R.of, cars)
[[]]

Если я перейду к списку, а не к словарю, то получу правильное декартово произведение, но результатом будут (конечно) списки вместо словарей.

R.sequence(R.of, [['yellow', 'red'], [2017], ['coup', 'sedan']])
[["yellow", 2017, "coup"], ["yellow", 2017, "sedan"], ["red", 2017, "coup"], ["red", 2017, "sedan"]]

1 ответ

Я могу придумать два способа сделать это, один из которых включает sequenceа другой нет.

Этот использует ваш sequence(of) позвоните выше:

const convert = lift(map)(
  compose(zipObj, keys), 
  compose(sequence(of), values)
)

const all_cars = convert(cars);

Другой был построен по моей обычной методике, заключающейся в постоянном изменении выходных данных одним преобразованием за другим, пока я не достигну того, что хочу:

const combine = pipe(
  toPairs,
  map(apply(useWith(map, [objOf, identity]))),
  reduce(xprod, [[]]),
  map(flatten),
  map(mergeAll)
)

const all_cars = combine(cars)

Это можно сделать немного яснее, если ввести несколько продуктов в нескольких списках:

const xproduct = reduce(pipe(xprod, map(unnest)), [[]])

const combine = pipe(
  toPairs,
  map(apply(useWith(map, [objOf, identity]))),
  xproduct,
  map(mergeAll)
)

Вторая версия - это то, что я придумал, когда впервые попробовал проблему. Затем, когда я посмотрел, что вы попробовали, я получил эту первую версию. Эта первая версия выглядит чище для меня, хотя большинство отдельных шагов во второй тривиальны. Но поскольку там есть один нетривиальный шаг, первый кажется абсолютным победителем.

Вы можете увидеть первое или второе на Рамле REPL.

Другие вопросы по тегам