集合与有序集合
Set vs OrderedSet
能否举例说明何时使用 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.
它恰好确实在末尾添加元素,但不能保证总是那样。它可能会在下一个版本中发生变化,并且不一定总是可以预测的。它所承诺的是在同一数据的多次迭代中保持稳定。
老实说,我看不到 OrderedSet 有任何有用的用例。根据需要,List、Map或OrderedMap甚至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>
雪上加霜的是,在 ImmutableJs RC12 中有一个 bug,这使得 OrderedSet 的行为方式相同(将更新的元素移动到列表的末尾)。该问题已在(到目前为止)未发布的即将发布的 4.0 版本中修复。
好的,这是一次有趣的旅行,你让我们(松散的维护者小组)再次研究这个很少使用的结构是如何工作的。
能否举例说明何时使用 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.
它恰好确实在末尾添加元素,但不能保证总是那样。它可能会在下一个版本中发生变化,并且不一定总是可以预测的。它所承诺的是在同一数据的多次迭代中保持稳定。 老实说,我看不到 OrderedSet 有任何有用的用例。根据需要,List、Map或OrderedMap甚至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>
雪上加霜的是,在 ImmutableJs RC12 中有一个 bug,这使得 OrderedSet 的行为方式相同(将更新的元素移动到列表的末尾)。该问题已在(到目前为止)未发布的即将发布的 4.0 版本中修复。
好的,这是一次有趣的旅行,你让我们(松散的维护者小组)再次研究这个很少使用的结构是如何工作的。