Используйте 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)
)
Вторая версия - это то, что я придумал, когда впервые попробовал проблему. Затем, когда я посмотрел, что вы попробовали, я получил эту первую версию. Эта первая версия выглядит чище для меня, хотя большинство отдельных шагов во второй тривиальны. Но поскольку там есть один нетривиальный шаг, первый кажется абсолютным победителем.