Коллекции и итераторы

Итераторы

Последнее обновление: 09.04.2018

Итераторы применяются для организации последовательного доступа к элементам коллекции - массивам, объектам 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"
Помощь сайту
WebMoney
  • P378451176208
  • Z280152397659
ЮMoney/Яндекс-Деньги
  • 410011174743222
PayPal
  • metanit22@mail.ru
Перевод на карту
  • Номер карты: 4048415020898850