2017-11-14 1 views
0

ramda의 sequence을 사용하여 사전을 트래버스 할 수 있습니까?ramda`sequence`를 사용하여 사전을 탐색하십시오.

나는 빈리스트

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

의 목록 내가 만약에 R.sequence 결과를 사용하여 횡단 결과

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'} 
] 

을 생산하고 싶습니다

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

다음 사전

을 감안할 때 올바른 카티 션 곱을 생성하는 사전 대신 목록을 트래버스하지만 res ults는 (물론) 사전 대신 목록입니다.

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

답변

1

나는이 작업을 수행하는 두 가지 방법, sequence을 포함 하나, 다른되지 생각할 수 있습니다. 내가 도달 할 때까지 내가 원하는

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

const all_cars = convert(cars); 

다른 하나는 다른 후 하나의 변환과 출력을 계속 변경의 평소 기술에 의해 만들어진 :

이 하나 위의 sequence(of) 호출을 사용

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) 
) 

두 번째 버전은 문제를 처음 시도한 것입니다. 그런 다음 당신이 시도한 것을 보았을 때 나는 그 첫 번째 버전을 얻었다. 첫 번째 버전은 나에게 깨끗해 보이지만 두 번째 단계의 개별 단계는 대부분 사소한 것입니다. 그러나 거기에 사소한 단 하나의 단계가 있기 때문에 첫 번째 것은 전반적인 승자로 보인다.

Ramda REPL에서 the first 또는 the second을 볼 수 있습니다.

+0

그래도 작동하지만 사전을 활용할 환상적인 'Traversable'인스턴스가 있어야합니다. – Cirdec

+0

Ramda는 [토론 한] (https://github.com/ramda/ramda/issues/2046) 여러 번 있습니다. 비가 교환적인 함수를 가질 수 있고 여전히 {a : 1, b : 2}와 {b : 2, a : 1}를 고려하기를 원할 때 어떤 물건을 접을 수있는 것도 어렵습니다. 같은. –

+0

미친. '{a : 1, b : 2} = {b : 2, a : 1} '을 고려한다고해서'Traversable '에 대한 표준 순서를 선택하는 것을 배제하지 않습니다. – Cirdec

관련 문제