JavaScript - ユーザー定義イテレータ:入門ガイド
こんにちは、未来のJavaScript魔法使いたち!今日は、ユーザー定義イテレータの世界に興味深く飛び込みます。プログラミングが初めてであっても心配しないでください。あなたの親切なガイドとして、私は一切をステップバイステップで説明します。コーヒーを一杯取り、一緒に潜りましょう!
イテレータとは?
深みには飛び込まず、まずは基本から始めましょう。あなたがチョコレートの箱を持っている(うまそう!)、イテレータは魔法の手のように一つ一つのチョコレートを取り出し、どれを食べたかを追跡します。
JavaScriptの言葉では、イテレータはnext()
メソッドを定義したオブジェクトで、シーケンスの次のアイテムを返します。このメソッドがイテレータの魔法の鍵です!
next()メソッド:イテレーションの心臓
next()
メソッドはすべてのアクションが起こる場所です。イテレータの車のエンジンです。それを分解してみましょう。
next()の構造
{
value: any,
done: boolean
}
このメソッドは以下の2つのプロパティを持つオブジェクトを返します:
-
value
: シーケンスの次の値。 -
done
: シーケンスが終了したかどうかを示すブール値。
簡単な例で動作を見てみましょう:
function simpleIterator() {
let count = 0;
return {
next: function() {
count++;
if (count <= 3) {
return { value: count, done: false };
}
return { value: undefined, done: true };
}
};
}
const iterator = simpleIterator();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
この例では、私たちのイテレータは3まで数えます。next()
を呼ぶたびに、終わりに達するまで次の数字を返します。小さなカウントマシンのようなものです!
ユーザー定義イテレータ:自分だけの魔法を創造する
基本を理解したので、自分のイテレータを作ってみましょう。好きな曲のプレイリストを作っているとします。そのプレイリストを巡回するイテレータを作成します。
function playlistIterator(songs) {
let currentIndex = 0;
return {
next: function() {
if (currentIndex < songs.length) {
return {
value: songs[currentIndex++],
done: false
};
} else {
return { done: true };
}
}
};
}
const myPlaylist = ['Bohemian Rhapsody', 'Stairway to Heaven', 'Hotel California'];
const myMusicIterator = playlistIterator(myPlaylist);
console.log(myMusicIterator.next()); // { value: 'Bohemian Rhapsody', done: false }
console.log(myMusicIterator.next()); // { value: 'Stairway to Heaven', done: false }
console.log(myMusicIterator.next()); // { value: 'Hotel California', done: false }
console.log(myMusicIterator.next()); // { done: true }
ここで、私たちは自分のプレイリストを巡回するplaylistIterator
を作成しました。next()
を呼ぶたびに、すべての曲を聞き終えるまで次の曲を返します。自分だけのDJのようなものです!
オブジェクトをイテラブルにする
私たちのオブジェクトをイテラブルにすることもできます。ページを巡回するBook
オブジェクトを作成してみましょう:
const Book = {
title: 'The Great Gatsby',
pages: ['It was the best of times...', 'Call me Ishmael...', 'The end.'],
[Symbol.iterator]: function() {
let pageIndex = 0;
return {
next: () => {
if (pageIndex < this.pages.length) {
return { value: this.pages[pageIndex++], done: false };
} else {
return { done: true };
}
}
};
}
};
for (let page of Book) {
console.log(page);
}
この例では、Book
オブジェクトをfor...of
ループで巡回することができます。ページをめくるようなものです!
実用的な応用:どこで使える?
ユーザー定義イテレータは多くのシナリオで非常に役立ちます:
- カスタムデータ構造:自分のデータ構造を作成した場合、どのようにイテレートされるべきかを定義できます。
- ラージ評価:メモリ内にすべての値を保持することなく、オンデマンドで値を生成します。
- 無限シーケンス:フィボナッチ数列などの無限シーケンスのためのイテレータを作成します。
無限フィボナッチシーケンスのイテレータの例を見てみましょう:
function fibonacciIterator() {
let [prev, curr] = [0, 1];
return {
next: function() {
[prev, curr] = [curr, prev + curr];
return { value: prev, done: false };
}
};
}
const fib = fibonacciIterator();
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2
console.log(fib.next().value); // 3
console.log(fib.next().value); // 5
このイテレータは永久にフィボナッチ数を生成し続けます!数学の精霊のようなものです。
結論:イテレーションの力
ユーザー定義イテレータは、データをどのように巡回するかをコントロールする力を私たちに与えます。自分だけのツールのように、コードを正確にナビゲートする助けになります。本のページをめくる、プレイリストをシャッフルする、無限の数学的シーケンスを生成するなど、イテレータはあなたをサポートします!
覚えておいてください、イテレータをマスターする鍵は練習です。さまざまなシナリオで自分のイテレータを作成してみてください。もしかしたら、カードのデッキや素数を生成するイテレータなど、可能性は無限にあります!
ハッピーコーディング、そしてあなたのイテレータが次の値を見つけることができることを願っています!
メソッド | 説明 | 返り値 |
---|---|---|
next() | イテレーションシーケンスの次の値を返す | 'value'と'done'プロパティを持つオブジェクト |
[Symbol.iterator]() | オブジェクトをイテラブルにする | イテレータオブジェクトを返す |
Credits: Image by storyset