2017-12-11 14 views
0

Immutable.js '설정 문제가 있습니다. 문서에 따르면 고유 값만 포함 할 수 있습니다. 이 fiddle의 코드는 세트에 중복 된 항목 2 개가 생깁니다.Immutable.js 세트에 중복 값이 ​​포함되어 있습니다.

이 단위 테스트는 통과하지만 대부분 사용자 오류 일 가능성이 큽니다.

it('should only have unique object values',() => { 
    const set = Set<any>(); 
    const newSet = set.add({ form: 'form1', name: 'control1', value: 10 }); 
    const finalSet = set.add({ form: 'form1', name: 'control1', value: 10 }); 
    expect(finalSet.count()).toBe(1); 
}); 

누구나 설명 할 수 있습니까?

+0

테스트 케이스에 오타가 있음을 유의하십시오. 두 번 모두'set '에 추가해야합니다. –

답변

1

은 테스트 케이스에 버그가있다 - 당신은 (오히려 newSet 두 번째 시간보다) set에 두 번 추가하고 있습니다. 이 문제를 해결하면 테스트가 실패합니다.

Immutable.js's Set uses Immutable.is to check for equality. 그러나 예상대로 작동하지 않습니다 - 그것은 (심지어 같은 구조) 별개의 JS 객체를 고려하지 않습니다 동일합니다 : 1

:

const x = { a: 1 }; 
const y = { a: 1 }; 
console.log(Immutable.is(x, y));          // false 

이것은 불변의 객체로 전환하여 고정 당신은 일반적으로 미묘한 이러한 종류의 문제를 방지하기 위해, 가능한 한 빨리해야

console.log(Immutable.is(Immutable.fromJS(x), Immutable.fromJS(y))); // true 


1.

+0

좋아, 지금 나는 어리 석다. 그리고 우연의 일치로, 당신은 나의 followup 질문이었을 것 인 것에 응답했다 : 그들 중의 1 명만 그것을 만드는 방법 :) –

0

동일한 키/값 쌍을 포함하고 있어도 실제로 추가하는 두 개체가 서로 다른 개체 (따라서 집합의 다른 값)이기 때문입니다.

다른 문제는 newSet을 사용하여 finalSet을 만들지 않는다는 것입니다. 당신은 실제 같은 개체를 사용하는 경우

는 두 번 작동합니다 :

it('should only have unique object values',() => { 
    const set = Set<any>(); 
    const obj = { form: 'form1', name: 'control1', value: 10 }; 
    const newSet = set.add(obj); 
    const finalSet = newSet.add(obj); 
    expect(finalSet.count()).toBe(1); 
}); 
+1

나는 OP가 그들에게 두 객체가 동등 할 것으로 기대하고 있으므로,'Immutable.is' (https://facebook.github.io/immutable-js/docs/#/Set 참조)를 만족시킬 것으로 생각합니다. –

+0

정확하고, 당신이 자세히 읽는다면 나는 테스트가 실제로 통과하지만 피들의 코드는 똑같은 방식으로 행동하지 않는다고 말하고 있습니다. –

+0

이 코드는 잘 작동하지만, 다른 미묘한 변화는 newSet을 사용하여 finalSet을 작성하지 않은 것입니다. 이것은 아마 문제 일 것입니다. 나는 확실히이 대답이 downvote를받을 가치가 있다고 생각하지 않는다. – willwoo