Map.forEach, почему удаление элементов в цикле работает? - PullRequest
0 голосов
/ 25 апреля 2018

Если вы удаляете элементы массива в цикле forEach, вы можете пропустить некоторые элементы, например:

    let arr = [['One', 1], ['Two', 2], ['Three', 3], ['Four', 4]]
    arr.forEach((i, ix) => i[1] <= 3 && arr.splice(ix,1));          // Two is not deleted
    console.log(arr)

Но если вы применяете forEach к объекту Map, он работает:

let map = new Map( [['One', 1], ['Two', 2], ['Three', 3], ['Four', 4]] );
map.forEach( (value,key)  => value <= 3 && map.delete(key));
console.log([...map.entries()])

Какие внутренние элементы в Map.forEach обеспечивают надежное удаление и другие операции (вставки?)

(Это возникло в вопросе, связанном с )

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Если вы удаляете элементы массива в цикле forEach, вы можете пропустить некоторые элементы

См. Array.prototype.forEach:

Если значения существующих элементов массива будут изменены, значение, переданное в функцию обратного вызова, будет значением во время их обращения к forEach (); элементы, которые были удалены перед посещением, не посещаются. Если уже посещенные элементы удаляются (например, с помощью shift ()) во время итерации, более поздние элементы будут пропущены [...]


Какие внутренние элементы в Map.forEach обеспечивают надежное удаление и другие операции (вставки?)

См. Map.prototype.forEach:

Метод forEach выполняет предоставленный обратный вызов один раз для каждого ключа карты , который фактически существует.

А поскольку ключ не привязан к порядку, он не повлияет на цикл. Да, он выполняется в порядке вставки, но это не смещает цикл при использовании forEach для удаления элементов с карты.

0 голосов
/ 25 апреля 2018

Массив имеет динамические индексы, и если один элемент склеивается, остальные элементы просто перемещаются и получают новые отступы.

Это причина того, что вы сращиваете неправильные части, повторяя с самого начала.


Используя Map, индексы используются в качестве ключей, и если один элемент удаляется, все остальные элементы карты сохраняют свои ключи.

При последующем рендеринге массива пропавшие элементы и их ключи исчезли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...