javascript - 集合与有序集合

标签 javascript set immutable.js ordered-set

您能否举例说明何时使用 OrderedSet 而不是 Set?我已经运行了一些测试,甚至the immutable-js documentation

Iteration order of a Set is undefined, however is stable

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

A type of Set that has the additional guarantee that the iteration order of values will be the order in which they were added.

最佳答案

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

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

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

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,a:true}), 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());
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/4.0.0-rc.12/immutable.js"></script>

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

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

关于javascript - 集合与有序集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65439425/

相关文章:

c# - 使用响应对象创建子页面弹出窗口会破坏父页面的格式

python - 在python中对自定义类执行集合操作

javascript - TypeScript 中的强类型 Immutable.js 记录

javascript - 使用 ImmutableJS 更新映射列表中的一个键

flowtype - 使用 immutablejs 记录并在其中调用更新时无法解决流注释错误

javascript - 在 Angular Controller 中将 Rails 日期时间更改为字符串

javascript - 为什么在JS中arrayTest[undefined]有效

javascript - 我可以更改 MVC 中 Kendo UI 网格的工具提示默认操作吗?

java - 封装的 Map<> 值的 keySet() 的时间复杂度

scala - Scala ObservableSet Trait 的使用示例