一道关于 ARRAY 深度展开的面试题
生活随笔
收集整理的這篇文章主要介紹了
一道关于 ARRAY 深度展开的面试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天面試的時候,考官出了這么一個題,寫一個函數,輸入a = [1,[2,3,[4,5,6]]],輸出a = [1,2,3,4,5,6]。當時我腦子有點短路,做了好久,給出了個不太符合要求的答案如下
var a = [1,[2,3,[4,5,6]]] var arr = [] function merge(a) {for(var i = 0; i < a.length; i++){if(Array.isArray(a[i])){merge(a[i])} else {arr.push(a[i])}}return arr }回家后稍微完善了下,符合了考官輸入輸出的要求了(不過也晚了)
function flatten(a) {if (!Array.isArray(a)) returnvar arr = []return (function merge(a) {for(var i = 0, l = a.length; i < l; i++){if(Array.isArray(a[i])){merge(a[i])} else {arr.push(a[i])}}return arr})(a) }然后跟朋友聊天問問有啥簡單的方法,朋友給了一個挺符合這個題的簡單方法類似如下
const flatten = (arr) => arr.toString().split(',').map(v => Number(v))不過這個答案只適用于這道題,如果不是全數字的就不行了。于是在GitHub上搜索array flatten,看了看排名前三的源碼,發現有好多不同的寫法,比如
function flatten() {var args = Array.from(arguments)do {args = [].concat.apply([], args)} while (args.some(Array.isArray))return args }也有這么寫的
function flatten (array) {var result = Array.prototype.concat.apply([], array)if (result.length === array.length) {return result}return flatten(result) }寫法各不相同,還有好多看似類似,但細節上不一樣的,所以關鍵就看性能了,好在arr-flatten和array-flatten中就都有benchmark,進行了各種比較
arr-flatten這個項目中,在各種不同的、可以在 npm 上搜到的array flatten實現方法之間進行了比較,最后的結論是array-flatten執行的效率最高
array-flatten項目里的benchmark主要是自己源碼中細節不同的寫法之間的差異,最后得出的最佳實踐如下
function flatten (array) {if (!Array.isArray(array)) {throw new TypeError('Expected value to be an array')}return flattenFrom(array) }function flattenFrom (array) {return flattenDown(array, []) }function flattenDown (array, result) {for (var i = 0; i < array.length; i++) {var value = array[i]if (Array.isArray(value)) {flattenDown(value, result)} else {result.push(value)}}return result }這套代碼思路與我給出的答案是一樣的,但由于細節上的不同,導致用benchmark測試,執行效率比我寫的那個快了約20%
總結
以上是生活随笔為你收集整理的一道关于 ARRAY 深度展开的面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java窗口(JFrame)从零开始(8
- 下一篇: jQuery元素过滤