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会使用快速排序。