イテラブル ジェネレーター、無限、take関数
入門JavaScriptプログラミング (JD Isaacks(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT5(イテラブル)、LESSON 23(イテラブル)、23.6(練習問題)、Q23-1の解答を求めてみる。
コード
function take(n, iterable) {
let result = [],
i = 0;
if (n === 0) {
return result;
}
i++;
for (const iterator of iterable) {
result.push(iterator);
if (i === n) {
break;
}
i++;
}
return result;
}
function* naturalNumbers() {
for (let n = 0; true; n++) {
yield n;
}
}
let ns = [0, 1, 2, 5, 10];
for (const n of ns) {
console.log(take(n, naturalNumbers()));
}
function* oneTwoThree() {
yield 1;
yield 2;
yield 3;
}
for (const n of ns) {
console.log(take(n, oneTwoThree()));
}
入出力結果(Terminal、Zsh)
% node sample.js
[]
[ 0 ]
[ 0, 1 ]
[ 0, 1, 2, 3, 4 ]
[
0, 1, 2, 3, 4,
5, 6, 7, 8, 9
]
[]
[ 1 ]
[ 1, 2 ]
[ 1, 2, 3 ]
[ 1, 2, 3 ]
%