-
Notifications
You must be signed in to change notification settings - Fork 54
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
浅谈 JavaScript 处理树形结构的几个场景与方案 #4
Comments
|
LZ可是在起点写过小说? |
@fengchang 哇,被你发现了~~ |
我x。。在起点写过小说。。 |
无人问津的太监文,不足挂齿。 |
蛮好 |
mark,多种实现方式,赞 |
mark |
我猜也不会有别人用这个网名...当年看了你的小说简介还挺看好的,记得给你投了你的第二张推荐票,还给你留了条评论鼓励。可惜....没想到啊,世界真是小 |
@fengchang 握手,感谢~ |
喜欢的楼主对于ES6的分析,其实主要是用栈,和 队列 构造深度搜索,和广度搜索。DOM已经将树转化为了完全二叉树,所以用silibingElement搜索蛮方便。我之前写的一个PyMatrix框架,也是大量用到这个技巧。比较赞赏的是,楼主应用了Promise语法,不过现在更先进的 Asyncro ... wait 语法也很好。卤煮在这个demo中展示了良好的抽象能力,赞一个 |
非常好多谢 |
学习了 |
mark 一下,数学功底不错。 |
mark了 感谢LZ |
mark 感谢 |
写的很好。我之前只写出了方案1:递归模式。之前自己也想写循环,没想出解法。哈哈。 |
作者
: 工业聚日期
:2015-06-12前言
近日,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 处理树形结构的几种方法,希望看过后对你有帮助。
The text was updated successfully, but these errors were encountered: