淺談 JavaScript 處理樹形結構的幾個場景與方案

發表於2015-06-18

前言

近日,Mac 下著名軟體 Homebrew 的作者,因為沒解出來二叉樹翻轉的白板演算法題,慘遭 Google 拒絕,繼而引發推特熱議。

在 JavaScript 中也有很多樹形結構。比如 DOM 樹,省市區地址聯動,檔案目錄等; JSON 本身就是樹形結構。

很多前端面試題也跟樹形結構的有關,比如在瀏覽器端寫遍歷 DOM 樹的函式,比如在 nodejs 執行時遍歷檔案目錄等。

這裡演示用 JavaScript 遍歷樹形結構的幾種策略。

場景1:遍歷 DOM 樹

方案1:遞迴模式

將上述程式碼黏貼到任意頁面的控制檯 console 中執行。

方案2:迴圈模式

在迴圈模式中,shift方法可以換成pop,從尾部取出元素;push方法可以換成unshift從頭部新增元素。不同的順序,影響了是「廣度優先」還是「深度優先」。

場景2:在 nodejs 執行時裡遍歷檔案目錄

子場景1:同步模式

方案1:遞迴

將上面的程式碼儲存在 tree.js 中,然後在當前資料夾開啟命令列,輸入node tree.js,目錄資訊儲存在生成tree.json檔案中。

方案2:迴圈

迴圈策略中的pop跟shift,push跟unshift也可以互換以調整優先順序,甚至用可以用splice方法更精細的控制stack陣列。迴圈模式比遞迴模式更可控。

子場景2:非同步模式

方案1:過程式 Promise

上面的函式都能工作,但都是一個個function的呼叫,顯得太「過程式」;

能不能用物件導向的方式來寫呢?

當然可以。

其實物件導向的寫法,更清晰。

為了更加語義化,以及增顯逼格。

我們用 ES6 的 class 來寫這個樹形結構類。

方案2:ES6-class + ES6-Promise

因為當前 JavaScript 引擎對 ES6 的支援度還不夠,所以上述程式碼不能直接執行。可以通過以下兩種方式來驗證程式碼能不能跑起來。

第一種,先 npm install -g bable 全域性安裝 babel 工具,再以 babel-node tree.js的方式取代 node tree.js 來執行上述程式碼。

第二種,將上述程式碼黏貼到 https://babeljs.io/repl/,拿到編譯為 ES5 的程式碼,將程式碼儲存在 tree.js檔案中,以 ES5 的形式執行。

結語

以上就是我知道的一些用 JavaScript 處理樹形結構的幾種方法,希望看過後對你有幫助。

相關文章