今天面試的時候,考官出了這麼乙個題,寫乙個函式,輸入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) else
} return arr
}
回家後稍微完善了下,符合了考官輸入輸出的要求了(不過也晚了)
function flatten(a) else
}return arr
})(a)
}
然後跟朋友聊天問問有啥簡單的方法,朋友給了乙個挺符合這個題的簡單方法類似如下
const flatten = (arr) => arr.tostring().split(',').map(v => number(v))
不過這個答案只適用於這道題,如果不是全數字的就不行了。於是在github
上搜尋array flatten
,看了看排名前三的原始碼,發現有好多不同的寫法,比如
function flatten() while (args.some(array.isarray))
return args
}
也有這麼寫的
function flatten (array)
return flatten(result)
}
寫法各不相同,還有好多看似類似,但細節上不一樣的,所以關鍵就看效能了,好在arr-flatten和array-flatten中就都有benchmark
,進行了各種比較
arr-flatten這個專案中,在各種不同的、可以在 npm 上搜到的array flatten
實現方法之間進行了比較,最後的結論是array-flatten執行的效率最高
array-flatten專案裡的benchmark
主要是自己原始碼中細節不同的寫法之間的差異,最後得出的最佳實踐如下
function flatten (array)
return flattenfrom(array)
}function flattenfrom (array)
function flattendown (array, result) else
} return result
}
這套**思路與我給出的答案是一樣的,但由於細節上的不同,導致用benchmark
測試,執行效率比我寫的那個快了約20% 一道關於訊號的題
用fork建立兩個子程序,呼叫signal 讓父程序接收鍵盤上的中斷訊號 control c 捕捉到訊號後父程序用kill 向子程序傳送自定義訊號,子程序捕捉到訊號後分別輸出如下資訊後終止 child process 1 is killed by parent child process 2 is ...
360一道關於this的題目
原題目是這樣子的 window.val 1 var obj 說出下面的輸出結果 obj.dbl var func obj.dbl func this呢其實就是這樣,分清楚呼叫就好了。obj中的沒有指定呼叫。預設從函式中查詢。如果沒有則往上一級查詢。所以 上面的式子可以寫成這樣 window.val ...
一道關於矩陣的題
wzz的視察 檔名 inspect 時限 1s 記憶體 256mb decription wzz擁有乙個王國。他的王國是長方形的,跨越了n個維度區和m個經度區,且在每個經度區和緯度區的交界處有一座城市 即wzz的王國一共有n m座城市 某一天早上,wzz從他的一萬平方公尺的大床上起來,他決定去視察一...