我遇到了与Immutable.js有关的问题'设置,根据文档只能包含唯一值。 此fiddle中的代码将导致集合中有2个重复条目。
虽然此单元测试通过,但问题很可能是用户错误。
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 :(得分:1)
您的测试用例中存在一个错误 - 您两次都会添加set
(而不是第二次添加到newSet
)。如果你解决了这个问题,那么测试就会失败。
Immutable.js's Set
uses Immutable.is
to check for equality。但是这并不像你期望的那样 - 它不认为不同的JS对象(即使具有相同的结构)是相同的:
const x = { a: 1 };
const y = { a: 1 };
console.log(Immutable.is(x, y)); // false
通过切换到不可变对象来解决这个问题: 1
console.log(Immutable.is(Immutable.fromJS(x), Immutable.fromJS(y))); // true
<小时/> <子> 1。你应该尽早做,以避免这些微妙的问题。
答案 1 :(得分:1)
我已经完成:
const stuff = Immutable.List(data)
.map(x => Immutable.fromJS(x))
.toSet()
.map(x => x.toJS())
我的输入是一个对象数组,并使所有对象不可变,因此该集合不再包含不完整的值。
这并不是一个更好的答案,事实上,我意识到这是阅读本文后需要做的。但这不是一个坏模式。
答案 2 :(得分: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);
});