Immutable.js Set包含重复值

时间:2017-12-11 19:14:53

标签: javascript immutable.js

我遇到了与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);
});

任何人都可以解释一下吗?

3 个答案:

答案 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);
});