BETA

速習ECMAScript2018を勉強する イテレータ編

投稿日:2018-11-15
最終更新:2018-11-15

イテレータ編

  • イテレータとは、列挙可能なオブジェクトで、nextメソッドが使えるものをいうらしいです。
  • value, done が返り値で、doneがtrueになることで、value値の終わりを判断します。
  • for...of で回せるものは、イテレータに変換できます。
let array = [1, 2, 3];

let map = new Map();
map.set('a', 'AAA');
map.set('b', 'BBB');
map.set('c', 'CCC');

for(let value of array) {
  console.log(value);
}
let itr = array.values(); // イテレータにする
let i;
while(i = itr.next()) {
  if (i.done)  break
    console.log(i)
}



for(let [key, value] of map) {
  console.log(`${key}:${value}`);
}

let itr_map = map.values();
let m;

while(m=itr_map.next()) {
    if (m.done) break
    console.log(m)
}
  • 文字列も, for...of で回せるので、イテレータブルなのですが、需要がないのかvaluesメソッドが用意されていません。
  • Symbol.iterator を使ってください。
const str = 'abcdef';

for(let value of str) {
    console.log(value)
}
const str_itr = str[Symbol.iterator]()
// console.log(str_itr)
let i;
while(i = str_itr.next()) {
    if (i.done) break;
    console.log(i)
}
  • クラス定義でも、イテレータが使えるみたいです。
class MyClass {
    constructor(...data) {
        this._data = data;
    }

    [Symbol.iterator]() {
        let current = 0    ;
        return {
            next: () => {
                return current < this._data.length ?
                     { value: this._data[current++], done: false } :
                     { done: true };
            }
        }
    }

    get data() {
        return this._data
    }
}

const array = ['AAA', 'BBB', 'CCC'];
const mc = new MyClass(...array);
console.log('Data: ', mc.data)

for (let value of mc) {
    console.log(value)
}

for (let value of array) {
    console.log(value)
}
  • だいぶ冗長では、ありますが、実装できています。
  • はじめの内は、class定義に慣れていないので、classに慣れる為にも使うようにしてみましょう。
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@atoris1192の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!