国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Alliot / 1856人閱讀

摘要:翻譯瘋狂的技術(shù)宅原文在本文中,我們將介紹兩種提取循環(huán)內(nèi)數(shù)據(jù)的方法內(nèi)部迭代和外部迭代。它是循環(huán)和遞歸的組合遞歸調(diào)用在行。

翻譯:瘋狂的技術(shù)宅 
原文:http://2ality.com/2018/04/ext...

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

循環(huán)

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

const fs = require("fs");
const path = require("path");

function logFiles(dir) {
  for (const fileName of fs.readdirSync(dir)) { // (A)
    const filePath = path.resolve(dir, fileName);
    console.log(filePath);
    const stats = fs.statSync(filePath);
    if (stats.isDirectory()) {
      logFiles(filePath); // (B)
    }
  }
}
logFiles(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)部迭代

const fs = require("fs");
const path = require("path");

function logFiles(dir, callback) {
  for (const fileName of fs.readdirSync(dir)) {
    const filePath = path.resolve(dir, fileName);
    callback(filePath); // (A)
    const stats = fs.statSync(filePath);
    if (stats.isDirectory()) {
      logFiles(filePath, callback);
    }
  }
}
logFiles(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):

const fs = require("fs");
const path = require("path");

function* logFiles(dir) {
  for (const fileName of fs.readdirSync(dir)) {
    const filePath = path.resolve(dir, fileName);
    yield filePath;
    const stats = fs.statSync(filePath);
    if (stats.isDirectory()) {
      yield* logFiles(filePath); // (A)
    }
  }
}
for (const p of logFiles(process.argv[2])) {
  console.log(p);
}

如果是內(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ù)。這是一種簡單的協(xié)作式多任務(wù)處理,其中 yield 暫停當(dāng)前任務(wù)并切換到另一個(gè)任務(wù)。

擴(kuò)展閱讀

Chapter “Iterables and iterators” in “Exploring ES6”.

Chapter “Generators” in “Exploring ES6”.

歡迎繼續(xù)閱讀本專欄其它高贊文章:

12個(gè)令人驚嘆的CSS實(shí)驗(yàn)項(xiàng)目

世界頂級(jí)公司的前端面試都問些什么

CSS Flexbox 可視化手冊(cè)

過節(jié)很無聊?還是用 JavaScript 寫一個(gè)腦力小游戲吧!

從設(shè)計(jì)者的角度看 React

CSS粘性定位是怎樣工作的

一步步教你用HTML5 SVG實(shí)現(xiàn)動(dòng)畫效果

程序員30歲前月薪達(dá)不到30K,該何去何從

第三方CSS安全嗎?

談?wù)剆uper(props) 的重要性

本文首發(fā)微信公眾號(hào):jingchengyideng 歡迎掃描二維碼關(guān)注公眾號(hào),每天都給你推送新鮮的前端技術(shù)文章

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/102282.html

相關(guān)文章

  • ES6:解構(gòu)——JavaScript 從數(shù)組和對(duì)象提取數(shù)據(jù)優(yōu)雅方法

    摘要:跳過數(shù)組中的元素學(xué)會(huì)了如何按順序從數(shù)組中提取數(shù)據(jù)。解構(gòu)方法中提供了很好的解決方案。從對(duì)象中提取數(shù)據(jù)依然從最基本的開始,提取從中提取和。 本文編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58f41a06a58c240ae35bb8e6 英文連接:ES6: Destructuring — an elegant...

    GraphQuery 評(píng)論0 收藏0
  • JavaScript那些語句

    摘要:前言基本上,我們每天都在和中的各種語句進(jìn)行著溝通,那些我們經(jīng)常見面的老朋友,或者是未曾見面的新朋友,它們共同維護(hù)著的流程,讓我們的程序穩(wěn)步運(yùn)行。 前言 基本上,我們每天都在和 JavaScript 中的各種語句進(jìn)行著 溝通 ,那些我們經(jīng)常見面的 老朋友,或者是未曾見面的 新朋友 ,它們共同維護(hù)著 JavaScript 的流程,讓我們的程序穩(wěn)步運(yùn)行。那么,你是否對(duì)它們足夠了解呢 如果文章...

    CoderBear 評(píng)論0 收藏0
  • JavaScript 編程精解 文第三版 九、正則表達(dá)式

    摘要:使用構(gòu)造器時(shí),需要將模式書寫成普通的字符串,因此反斜杠的使用規(guī)則與往常相同。構(gòu)造器的后四個(gè)參數(shù)小時(shí)分鐘秒毫秒是可選的,如果用戶沒有指定這些參數(shù),則參數(shù)的值默認(rèn)為。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Regular Expressions 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript...

    Pluser 評(píng)論0 收藏0
  • 編寫高效且優(yōu)雅 Python 代碼(1)

    摘要:查看原函數(shù)的參數(shù)注釋甚至函數(shù)名的時(shí)候,只能看到裝飾器的相關(guān)信息。也就是說,它是裝飾器的裝飾器,并且以原函數(shù)為參數(shù),作用是保留原函數(shù)的各種信息,使得我們之后查看被裝飾了的原函數(shù)的信息時(shí),可以保持跟原函數(shù)一模一樣。 貌似只能創(chuàng)建一個(gè)專欄,所以這篇文章只好放到JavaScript從前端到全終端里了? 原文鏈接:Effective Python Python 作為一門入門極易并容易上癮的語...

    roadtogeek 評(píng)論0 收藏0
  • JavaScript之變量及作用域

    摘要:所以的作用域是靜態(tài)作用域,也叫詞法作用域。總結(jié)是一門基于詞法作用域靜態(tài)作用域的語言,會(huì)沿著作用域鏈像氣泡一樣向外部尋找變量聲明。又是函數(shù)作用域的語言,在中,使用和關(guān)鍵字后,能讓變量處于塊作用域中,而且不存在聲明提升。 本文共 1700 字,讀完只需 7 分鐘 概述 變量,編程語言中我們用來模擬現(xiàn)實(shí)概念的工具,比方說,變量可以表示對(duì)象,數(shù)組,數(shù)字,字符。既然是工具,那么就用工具的適用范圍...

    Faremax 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<