bezpieczne dla new Set()
może wyglądać następująco:ES6: Czy usunięcie elementów z Set/Map podczas iteracji Set/Map jest niebezpieczne?
let items = [];
for (let item of set)
if (isBad(item))
items.push(item);
for (let item of items)
set.delete(item)
mogę uprościć kod do:
for (let item of set)
if (isBad(item))
set.delete(item);
bezpieczne dla new Map()
może wyglądać następująco:
let keys = [];
for (let [key, val] of map)
if (isBadKey(key) || isBadValue(val))
keys.push(key);
for (let key of keys)
map.delete(key)
mogę uprościć kod do :
for (let [key, val] of map)
if (isBadJey(key) || isBadValue(val))
map.delete(key)
Co jeśli 'Set()' zaimplementowane jako drzewo binarne? Usunięcie węzła może spowodować ponowne zrównoważenie drzewa. Czy to uszkodzi działanie iteratora? – gavenkoa
To nie jest. Według spec - wewnątrz [Set] (https://tc39.github.io/ecma262/#sec-set-iterable) jest bardziej podobny do [List] (https://tc39.github.io/ecma262/#sec -list -list-record-type-type): 'Ustaw wewnętrzne ustawienie [[SetData]] na nową pustą listę." – Kiril
Widzę opis 'Set' w terminach List. Czy jest to naiwne założenie, że 'Set' wykonuje' delete'/'add' /' has' w 'O (log2 (size))' time ale faktycznie w 'O (size)'? – gavenkoa