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

Итераторы

Итераторы применяются для организации последовательного доступа к элементам коллекции - массивам, объектам 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