一些有意思的js程式設計題
阿新 • • 發佈:2019-02-16
Q : 有個可憐的傢伙,由於某些原因無法使用js中的原型方法Array.prototype.sort,於是他寫下了如下的程式碼,希望奇蹟會發生:
const miracleSort = arr => { var result = [...arr] var sorted = false do { sorted = true for (var i = 1;i < result.length;++i) if (result[i] < result[i - 1]) { sorted = false
break } } while (!sorted) return result }作為js 大神,請幫助這個可憐的傢伙
要求 :呼叫方法miracleSort輸入正整數陣列,輸出排序後的陣列 ,例如 :
miracleSort([4,2,6,8,5]) //輸出[2 ,4 ,5,6 ,8]
A :
const arrayIterator = Array.prototype[Symbol.iterator] const miracleIterator = function()
{ let arr = this.slice() let swapped do { swapped = false for (let i = 0; i < arr.length - 1; ++i) { if (arr[i] > arr[i + 1]) { [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]] swapped = true } } } while (swapped) return arrayIterator.call(arr) } Array.prototype[Symbol.iterator] = miracleIterator本題的突破口在與
...
運算子會呼叫Iterator介面,解決辦法就是重寫Array的Symbol.iterator方法。因此第三行var result = [...arr]
得到的就是排過序的陣列。
Q : 如何在不使用Array.prototype.reverse方法的條件下翻轉陣列,並且程式碼位元組數不超過30?
A :reserve=a=>a.map(a.pop,[...a])
因為函式名是固定的,所以實際上可用的位元組就22個。想了很久,試過用a.sort(_=>1)
但是陣列長度超過12的話sort會使用快速排序。