Коллекции и итераторы
Итераторы
Итераторы применяются для организации последовательного доступа
к элементам коллекции - массивам,
объектам Set и Map.
Итераторы предоставляют метод next(),
который возвращает два значения:
value и done.
value хранит собственно значение текущего перебираемого элемента.
А свойство done указывает,
есть ли еще в коллекции объекты,
доступные для перебора.
Некоторые методы коллекций возвращают итераторы.
Например, метод entries(),
который есть у коллекций Array, Set, Map:
let users = ["Tom", "Bob", "Sam"]; let items = users.entries(); console.log(items.next());Метод next возвратит следующий объект на консоль:
{value: Array(2), done: false}
done: false
value: Array(2)
0: 0
1: "Tom"
length: 2
__proto__: Array(0)
__proto__: Object
Здесь мы видим, что свойство done имеет значение false
, так как мы перебрали только один элемент в множестве,
и там еще есть два элемента.
Свойство value представляет массив из двух значений. Первое значение представляет ключ или индекс элемента массива, а второй элемент - значение по этому индексу.
Соответственно мы можем организовать и перебор всей коллекции:
let users = ["Tom", "Bob", "Sam"];
let items = users.entries();
var result = items.next();
while(result.done === false){
console.log(result.value[0], result.value[1]);
result = items.next();
}
Консольный вывод:
0 "Tom"
1 "Bob"
2 "Sam"
Но в этом нет смысла, поскольку все коллекции,
возвращающие итераторы,
поддерживают перебор с помощью цикла for...of,
который как раз и использует итератор
для получения элементов:
let users = ["Tom", "Bob", "Sam"]; for(let val of users) console.log(val);Если мы хотим извлечь еще и индекс элемента в массиве, то мы можем использовать для перебора итератор из entries():
let users = ["Tom", "Bob", "Sam"];
for(let user of users.entries()){
console.log(user[0], user[1]);
}
Консольный вывод:
0 "Tom"
1 "Bob"
2 "Sam"
Output