微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

集合与有序集合

如何解决集合与有序集合

您能否举个例子,何时使用 OrderedSet 而不是 Set?我已经进行了几次测试,甚至 the immutable-js documentation

Set 的迭代顺序未定义,但稳定

似乎 Set 中的元素顺序始终与添加元素的顺序相同。 这似乎是 OrderedSet 结构的唯一好处:

一种 Set 类型,它额外保证值的迭代顺序将是它们添加的顺序。

解决方法

巧合确实在最后添加了元素,但不能保证总是那样。它可能会在下一个版本中发生变化,而且并不总是可以预测的。它所承诺的只是在同一数据的多次迭代中保持稳定。 老实说,我看不到 OrderedSet 的任何有用用例。根据需要,ListMapOrderedMap 甚至 Set 更适合。

如果您设法更新 Set,它可以更改顺序。同样,这对于数据结构来说通常是一个糟糕的选择,您可能应该重新排列您的数据结构,例如改用 OrderedMap 或 List。

以下示例显示顺序可能有点意外:

and
function modifySet(set) {
  set = set.add(0);
  set = set.add(1);
  set = set.add(2);
  return set.remove(0);
}

let unorderedSet = Immutable.Set([4,5]);
unorderedSet = modifySet(unorderedSet);
console.log('Set:');
for (const value of unorderedSet) {
  console.log(value);
}

let orderedSet = Immutable.OrderedSet([4,5]);
orderedSet = modifySet(orderedSet);
console.log('OrderedSet:');
for (const value of orderedSet) {
  console.log(value);
}

由于您可以修改集合的键 (!),因此它也可以对元素进行重新排序:

<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.12/immutable.js"></script>
let set = Immutable.Set([ Immutable.Map({b:1,a:true}),Immutable.Map({b:2,Immutable.Map({b:3,a:true}) ])
  .map((t) => {
  if (t.get('b') === 2) return t.set('a',false);
  return t;
  });

console.log('2 is now at the end');
console.log(set.toJS());

雪上加霜的是,ImmutableJs RC12 中有一个 bug,它使 OrderedSet 以相同的方式运行(将更新的元素移动到列表的末尾)。这个问题已经在(到目前为止)未发布的即将发布的 4.0 版本中修复了。

好吧,这是一次有趣的旅行,您让我们(松散的维护者小组)再次研究了这种很少使用的结构是如何工作的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。