0

그래서 나는 다음과 유사합니다 (입력, 입력)로 xprod를 호출하는 요구 사항이 몇 가지 코드를 가지고 :목록에서 요소를 비교하여 튜플을 필터링 할 수있는 포인트가없는 방법이 있습니까?

const input = [ 
    { id: 1, data: 'a' }, 
    { id: 2, data: 'b' }, 
]; 
const product = xprod(input, input); 
/* 
    [ 
    [ { id: 1, data: 'a' }, { id: 1, data: 'a' } ], 
    [ { id: 1, data: 'a' }, { id: 2, data: 'b' } ], 
    [ { id: 2, data: 'b' }, { id: 1, data: 'a' } ], 
    [ { id: 2, data: 'b' }, { id: 2, data: 'b' } ], 
    ] 
*/ 

나는 위의 첫 번째 요소를 비교하여 목록에서 튜플을 필터링하고 싶습니다 동일한 튜플의 두 번째 요소에 대한 튜플. 이 경우 동일한 ID를 가진 객체를 포함하는 튜플을 제거해야합니다 (그래서 0 번째와 3 번째 원소는 걸러 져야합니다 -이 단순화 된 예제에서 필자는 엄격한 동일성을 사용하여 필터 할 수도 있지만 실제로는 그렇지 않습니다) 코드에서 나는 실제로 쓰고있다).

람다를 사용하여이 작업을 매우 간단하게 수행 할 수 있다는 것을 알았지 만, 람다 (ramda)와 작업 할 때 이런 유형의 데이터 (튜플 목록)가 나오기 시작한 이래로 나는 종종 하나의 항목을 비교하려고 애썼다. 동일한 튜플에있는 다른 항목의 튜플을 자유로운 방식으로 가리킨다. 그리고 아마 그것은 단순하게 유지하고 람다를 사용하는 논쟁입니다. 그러나 그것을 할 다른 방법이 있다면 나는 궁금합니다.

Here's a link to a ramda repl 구현이 들어 있습니다.

+2

목록에 중복이 없다고 가정하면 대신 대각선을 건너 뛰는'xprod'를 사용할 수 없습니까? – Bergi

+0

아마 @Bergi - 현재 나의 경우 대각선 이외의 복제본은 없을 것입니다. 그래도 ramda가 제공 한 xprod를 사용하고있었습니다. 나는 확실히 내 자신을 쓸 수 있습니다. 그리고 아마도 그것은'filter'에 의해 요구되는 다음 반복을 건너 뛸 수 있다고 생각하면, 아마도 가장 빠른 방법 일 것입니다. – dvlsg

답변

4

하나의 옵션은 튜플의 두 개의 인수가 R.apply 인 것으로 기대하는 함수를 단순히 래핑하는 것입니다. 귀하의 예에서는 부분적으로 적용될 수 있습니다 R.eqProps.

R.filter(R.apply(R.eqProps('id')), product)