在 JavaScript 中優(yōu)雅的提取循環(huán)內(nèi)的數(shù)據(jù)

翻譯:瘋狂的技術(shù)宅?

http://2ality.com/2018/04/extracting-loops.html

在本文中溜嗜,我們將介紹兩種提取循環(huán)內(nèi)數(shù)據(jù)的方法:內(nèi)部迭代和外部迭代。

循環(huán)

舉個(gè)例子器瘪,假設(shè)有一個(gè)函數(shù)?logFiles():

1constfs?=require('fs');

2constpath?=require('path');

3

4functionlogFiles(dir){

5for(constfileNameoffs.readdirSync(dir))?{//?(A)

6constfilePath?=?path.resolve(dir,?fileName);

7console.log(filePath);

8conststats?=?fs.statSync(filePath);

9if(stats.isDirectory())?{

10logFiles(filePath);//?(B)

11}

12}

13}

14logFiles(process.argv[2]);

從 A 行開始的循環(huán)用來記錄文件路徑流强。它是?for-of?循環(huán)和遞歸的組合(遞歸調(diào)用在 B 行)脑慧。

如果你發(fā)現(xiàn)循環(huán)內(nèi)的某些數(shù)據(jù)(迭代文件)有用抡驼,但又不想記錄它阳藻,那應(yīng)該怎么辦晰奖?

內(nèi)部迭代

提取循環(huán)內(nèi)數(shù)據(jù)的第一個(gè)方法是內(nèi)部迭代

1constfs?=require('fs');

2constpath?=require('path');

3

4functionlogFiles(dir,?callback){

5for(constfileNameoffs.readdirSync(dir))?{

6constfilePath?=?path.resolve(dir,?fileName);

7callback(filePath);//?(A)

8conststats?=?fs.statSync(filePath);

9if(stats.isDirectory())?{

10logFiles(filePath,?callback);

11}

12}

13}

14logFiles(process.argv[2],?p?=>console.log(p));

這種迭代方式與Array的?.forEach()類似:logFiles()?內(nèi)實(shí)現(xiàn)循環(huán)并對(duì)每個(gè)迭代值(行A)調(diào)用?callback。

外部迭代

內(nèi)部迭代的替代方案是外部迭代:我們實(shí)現(xiàn)了一個(gè)iterable腥泥,可以用生成器幫助我們實(shí)現(xiàn):

1constfs?=require('fs');

2constpath?=require('path');

3

4function*logFiles(dir){

5for(constfileNameoffs.readdirSync(dir))?{

6constfilePath?=?path.resolve(dir,?fileName);

7yieldfilePath;

8conststats?=?fs.statSync(filePath);

9if(stats.isDirectory())?{

10yield*?logFiles(filePath);//?(A)

11}

12}

13}

14for(constpoflogFiles(process.argv[2]))?{

15console.log(p);

16}

如果是內(nèi)部迭代匾南,logFiles()?會(huì)調(diào)用我們(“推”給我們)。而這一次蛔外,換我們來調(diào)用它了(“拉”過來)蛆楞。

請(qǐng)注意,在生成器中夹厌,必須通過?yield*?進(jìn)行遞歸調(diào)用(第A行):如果只調(diào)用?logFiles()?那么它會(huì)返回一個(gè)iterable豹爹。但我們想要的是在該 iterable 中?yield?每個(gè)項(xiàng)目。這就是?yield*?的作用矛纹。

生成器有一個(gè)非常好的特性臂聋,就是處理過程能夠與內(nèi)部迭代一樣互鎖:每當(dāng)?logFiles()?創(chuàng)建另一個(gè)filePath?時(shí),我們能夠立即查看它或南,然后?logFiles()?繼續(xù)孩等。這是一種簡(jiǎn)單的協(xié)作式多任務(wù)處理,其中?yield?暫停當(dāng)前任務(wù)并切換到另一個(gè)任務(wù)采够。

擴(kuò)展閱讀

Chapter “Iterables and iterators” in “Exploring ES6”.【http://exploringjs.com/es6/ch_iteration.html】

Chapter “Generators” in “Exploring ES6”. 【http://exploringjs.com/es6/ch_generators.html】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肄方,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹬癌,更是在濱河造成了極大的恐慌权她,老刑警劉巖虹茶,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隅要,居然都是意外死亡蝴罪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門拾徙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洲炊,“玉大人,你說我怎么就攤上這事尼啡≡莺猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵崖瞭,是天一觀的道長(zhǎng)狂巢。 經(jīng)常有香客問我,道長(zhǎng)书聚,這世上最難降的妖魔是什么唧领? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮雌续,結(jié)果婚禮上斩个,老公的妹妹穿的比我還像新娘徘跪。我一直安慰自己率翅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布炼幔。 她就那樣靜靜地躺著鸽心,像睡著了一般滚局。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顽频,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天藤肢,我揣著相機(jī)與錄音,去河邊找鬼糯景。 笑死嘁圈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莺奸。 我是一名探鬼主播丑孩,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼灭贷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起略贮,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤甚疟,失蹤者是張志新(化名)和其女友劉穎仗岖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體览妖,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轧拄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讽膏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片檩电。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖府树,靈堂內(nèi)的尸體忽然破棺而出俐末,到底是詐尸還是另有隱情,我是刑警寧澤奄侠,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布卓箫,位于F島的核電站,受9級(jí)特大地震影響垄潮,放射性物質(zhì)發(fā)生泄漏烹卒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一弯洗、第九天 我趴在偏房一處隱蔽的房頂上張望旅急。 院中可真熱鬧,春花似錦牡整、人聲如沸藐吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炎码。三九已至,卻和暖如春秋泳,著一層夾襖步出監(jiān)牢的瞬間潦闲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工迫皱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歉闰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓卓起,卻偏偏與公主長(zhǎng)得像和敬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戏阅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測(cè)試 ...
    KeKeMars閱讀 6,305評(píng)論 0 6
  • Node.js是目前非持绲埽火熱的技術(shù),但是它的誕生經(jīng)歷卻很奇特奕筐。 眾所周知舱痘,在Netscape設(shè)計(jì)出JavaScri...
    w_zhuan閱讀 3,607評(píng)論 2 41
  • 模塊化公布自己的模塊功能. 其他模塊調(diào)用另外的模塊. 公布方法 如果要輸出一個(gè)鍵值對(duì)象{}变骡,可以利用exports...
    httIsHere閱讀 511評(píng)論 0 0
  • //公共引用 varfs =require('fs'), path =require('path'); 1、讀取文...
    才気莮孒閱讀 827評(píng)論 0 1