Этот подход сначала создает массив, а затем зацикливает его на плоском массиве.
class NestedIterator {
constructor(list) {
this.list = [];
let flat = (arr, index) => {
if (index === arr.length) return;
if (Array.isArray(arr[index])) flat(arr[index], 0);
else this.list.push(arr[index]);
flat(arr, ++index);
}
this.index = 0;
flat(list, 0);
this.length = this.list.length;
}
hasNext() {
return this.index < this.length;
}
next() {
if (this.hasNext()) return this.list[this.index++];
else return null; // maybe an error.
}
}
var list;
var iterator;
/* Should print
* 2
* 4
* 6
*/
list = [2, [4, [6]]];
iterator = new NestedIterator(list);
while (iterator.hasNext()) {
console.log(iterator.next());
}