ジェネレータ内で yield* な forEach したい
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ イテレータを返すような forEach をつくる
◆ for of などの関数スコープでないものを使う
◆ map で配列を返して それに yield*
◆ for of などの関数スコープでないものを使う
◆ map で配列を返して それに yield*
function *gen(arr){
arr.forEach(function*(e){
yield e*e*e
})
}
arr.forEach(function*(e){
yield e*e*e
})
}
こんな感じのことがしたいんです
↑は動いて欲しいとおりには動きません
配列をループで使用していて その中で yield を使いたいです
普通にやるならこれ
function *gen(arr){
for(const e of arr){
yield e*e*e
}
}
for(const e of arr){
yield e*e*e
}
}
forEach が使える状態で普通の for 文は極力書かないようにしたいですし それと同じで 構文の for of はあまり使いたくないです
ですが forEach で関数を呼び出すともう yield はつかえなくなります
やる方法は forEach がイテレータを返すようにして yield* を使うことになります
ということで
Array.prototype.gForEach = function*(fn){
for(let i=0;i<this.length;i++)
yield* fn(this[i], i, this)
}
for(let i=0;i<this.length;i++)
yield* fn(this[i], i, this)
}
を準備して
function *gen(arr){
yield* arr.gForEach(function*(e){
yield e*e*e
})
}
console.log([...gen([1,2,3])])
yield* arr.gForEach(function*(e){
yield e*e*e
})
}
console.log([...gen([1,2,3])])
[1, 8, 27]
動いてますね
for 書きたくないと言いつつかいてますが ライブラリ部分はめったに書くものではないですしパフォーマンスの都合もあるので仕方なく for を書いてます
ところで ひとつめを yield するタイミングで全部の結果が決まっていても良い場合はこれで おっけいです
function *gen(arr){
yield* arr.map(e => e*e*e)
}
yield* arr.map(e => e*e*e)
}
配列がとても大きいとか forEach 部分を実行するタイミングで結果が変わる場合は向いていません