欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript使用高階生成器進(jìn)行過濾以生成素?cái)?shù)

 更新時(shí)間:2024年02月23日 16:05:38   作者:42  
生成器大家都知道是怎么一回事,但是高階生成器又是什么東西呢,下面小編就來為大家簡(jiǎn)單介紹一下如何使用高階生成器進(jìn)行過濾以生成素?cái)?shù)吧

生成器大家都知道是怎么一回事,但是高階生成器又是什么東西呢?今天小編就帶著大家來一起了解一下吧……

先上代碼:

function* numFrom(start: number) {
    while (true) yield start++
}

function* filter(nums: Generator<number>, prime: number) {
    for (const n of nums) if (n % prime !== 0) yield n
}

let cur = numFrom(2)

for (let i = 0; i < 10; i++) {
    const prime = cur.next()
    if (!prime.done) {
        console.log(i, ':', prime.value)
        cur = filter(cur, prime.value)
    }
}

結(jié)果:

0 : 2
1 : 3
2 : 5
3 : 7
4 : 11
5 : 13
6 : 17
7 : 19
8 : 23
9 : 29

其中函數(shù) filter 傳入一個(gè)生成器,返回一個(gè)新的生成器,我們可以把它稱為高階生成器。

function* filter(nums: Generator<number>, prime: number) {
    for (const n of nums) if (n % prime !== 0) yield n
}

它的作用是過濾掉 nums: Generator<number> 生成的數(shù)中能被 prime 整除的數(shù):

const gen = filter(numFrom(10), 3)
for (let i = 0; i < 10; i++) {
    const n = gen.next()
    if (!n.done) console.log(n.value)
}

結(jié)果:

10
11
13
14
16
17
19
20
22
23

可以看到,3 的倍數(shù),1215、18、21 已經(jīng)被過濾掉了。

如果我們?cè)侔押瘮?shù)返回值作為參數(shù)傳給 filter,就能過濾掉多個(gè)值了:

let gen = filter(numFrom(10), 3) // 從 10 開始,不能被 3 整除的數(shù)
gen = filter(gen, 5) // 從 10 開始,不能被 3 和 5 整除的數(shù)
...

只要我們不斷把當(dāng)前的生成器和產(chǎn)生的素?cái)?shù)傳入,我們就能夠?qū)崿F(xiàn)過濾,相當(dāng)于使用篩法生成素?cái)?shù)。

let cur = numFrom(2)

for (let i = 0; i < 10; i++) {
    const prime = cur.next()
    if (!prime.done) {
        console.log(i, ':', prime.value)
        cur = filter(cur, prime.value) // 產(chǎn)生新的生成器
    }
}
numFrom(2) -> filter(2) -> filter(3) -> filter(5) -> filter(7) ...

如果還不太清除,可以在控制臺(tái)打印詳細(xì)過程:

function* numFrom(start: number) {
    while (true) {
        console.log('\nnum yield', start)
        yield start++
    }
}

let filterDeep = 0
function* filter(nums: Generator<number>, prime: number) {
    const deep = filterDeep++
    for (const n of nums)
        if (n % prime !== 0) {
            console.log(`filter yield[${deep}] ${n}`)
            yield n
        } else console.log(`filtered[${deep}] ${n} by ${prime}`)
}

let cur = numFrom(2)

for (let i = 0; i < 10; i++) {
    const prime = cur.next()
    if (!prime.done) {
        console.log(i, ':', prime.value)
        cur = filter(cur, prime.value)
    }
}

結(jié)果:

num yield 2
0 : 2

num yield 3
filter yield[0] 3
1 : 3

num yield 4
filtered[0] 4 by 2

num yield 5
filter yield[0] 5
filter yield[1] 5
2 : 5

num yield 6
filtered[0] 6 by 2

num yield 7
filter yield[0] 7
filter yield[1] 7
filter yield[2] 7
3 : 7

num yield 8
filtered[0] 8 by 2

num yield 9
filter yield[0] 9
filtered[1] 9 by 3

num yield 10
filtered[0] 10 by 2

num yield 11
filter yield[0] 11
filter yield[1] 11
filter yield[2] 11
filter yield[3] 11
4 : 11

num yield 12
filtered[0] 12 by 2

num yield 13
filter yield[0] 13
filter yield[1] 13
filter yield[2] 13
filter yield[3] 13
filter yield[4] 13
5 : 13

num yield 14
filtered[0] 14 by 2

num yield 15
filter yield[0] 15
filtered[1] 15 by 3

num yield 16
filtered[0] 16 by 2

num yield 17
filter yield[0] 17
filter yield[1] 17
filter yield[2] 17
filter yield[3] 17
filter yield[4] 17
filter yield[5] 17
6 : 17

num yield 18
filtered[0] 18 by 2

num yield 19
filter yield[0] 19
filter yield[1] 19
filter yield[2] 19
filter yield[3] 19
filter yield[4] 19
filter yield[5] 19
filter yield[6] 19
7 : 19

num yield 20
filtered[0] 20 by 2

num yield 21
filter yield[0] 21
filtered[1] 21 by 3

num yield 22
filtered[0] 22 by 2

num yield 23
filter yield[0] 23
filter yield[1] 23
filter yield[2] 23
filter yield[3] 23
filter yield[4] 23
filter yield[5] 23
filter yield[6] 23
filter yield[7] 23
8 : 23

num yield 24
filtered[0] 24 by 2

num yield 25
filter yield[0] 25
filter yield[1] 25
filtered[2] 25 by 5

num yield 26
filtered[0] 26 by 2

num yield 27
filter yield[0] 27
filtered[1] 27 by 3

num yield 28
filtered[0] 28 by 2

num yield 29
filter yield[0] 29
filter yield[1] 29
filter yield[2] 29
filter yield[3] 29
filter yield[4] 29
filter yield[5] 29
filter yield[6] 29
filter yield[7] 29
filter yield[8] 29
9 : 29

參考:

通道 - Kotlin 官方文檔 https://book.kotlincn.net/text/channels.html

以上就是JavaScript使用高階生成器進(jìn)行過濾以生成素?cái)?shù)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript高階生成器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于JS中的方法是否加括號(hào)的問題

    關(guān)于JS中的方法是否加括號(hào)的問題

    在我們js編寫程序的時(shí)候,我們會(huì)寫很多函數(shù)然后調(diào)用它們,那么這些函數(shù)調(diào)用的時(shí)候什么時(shí)候加()什么時(shí)候不加()呢?下面小編給大家簡(jiǎn)單介紹下
    2016-07-07
  • 微信小程序?qū)崿F(xiàn)分頁功能

    微信小程序?qū)崿F(xiàn)分頁功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)分頁功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 如何實(shí)現(xiàn)js拖拽效果及原理解析

    如何實(shí)現(xiàn)js拖拽效果及原理解析

    這篇文章主要介紹了如何實(shí)現(xiàn)js拖拽效果及原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • JavaScript對(duì)象數(shù)組排序函數(shù)及六個(gè)用法

    JavaScript對(duì)象數(shù)組排序函數(shù)及六個(gè)用法

    本文給大家分享一個(gè)用于數(shù)組或者對(duì)象的排序的函數(shù)。該函數(shù)可以以任意深度的數(shù)組或者對(duì)象的值作為排序基數(shù)對(duì)數(shù)組或的元素進(jìn)行排序
    2015-12-12
  • PHP讀取遠(yuǎn)程txt文檔到數(shù)組并實(shí)現(xiàn)遍歷

    PHP讀取遠(yuǎn)程txt文檔到數(shù)組并實(shí)現(xiàn)遍歷

    這篇文章主要介紹了PHP讀取遠(yuǎn)程txt文檔到數(shù)組并實(shí)現(xiàn)遍歷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 微信開發(fā)相關(guān)功能之使用微信JS-SDK接口

    微信開發(fā)相關(guān)功能之使用微信JS-SDK接口

    這篇文章主要給大家介紹了關(guān)于微信開發(fā)相關(guān)功能之使用微信JS-SDK接口的相關(guān)資料,微信SDK是一套開發(fā)工具包,為開發(fā)者提供了許多API接口,使得開發(fā)一個(gè)微信公眾號(hào)變得更加簡(jiǎn)單,需要的朋友可以參考下
    2023-12-12
  • 30個(gè)高逼格代碼的JavaScript高級(jí)單行代碼

    30個(gè)高逼格代碼的JavaScript高級(jí)單行代碼

    這篇文章中列出了一個(gè)系列的 30 個(gè) JavaScript 單行代碼,它們?cè)谑褂?nbsp;vanilla js(≥ ES6)進(jìn)行開發(fā)時(shí)非常有用,它們也是使用該語言在最新版本中為我們提供的所有功能來解決問題的優(yōu)雅方式,將它們分為以下5大類:日期、字符串、數(shù)字、數(shù)組、工具
    2023-08-08
  • JS去掉字符串中所有的逗號(hào)

    JS去掉字符串中所有的逗號(hào)

    這篇文章主要介紹了JS去掉字符串中所有的逗號(hào),需要的朋友可以參考下
    2017-10-10
  • JS實(shí)現(xiàn)指定區(qū)域的全屏顯示功能示例

    JS實(shí)現(xiàn)指定區(qū)域的全屏顯示功能示例

    這篇文章主要介紹了JS實(shí)現(xiàn)指定區(qū)域的全屏顯示功能,涉及javascript事件響應(yīng)及頁面元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-04-04
  • 使用Dropzone.js上傳的示例代碼

    使用Dropzone.js上傳的示例代碼

    本篇文章主要介紹了使用Dropzone.js上傳的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10

最新評(píng)論