其实网上搜索这些方法一堆堆的,之因此还来写一遍主要是由于本身习惯一种以后就忘了其余方法怎么实现,就写一写总结一下,顺便作个测试看看哪一个效率最高,为了更好展现效果,我会先总结认为比较好的方法,后面统一测试。(舒适提示:下文衹是为了简便,通常状况下不建议写在原型上,容易污染全局)数组
var ary = [14, 12, 2, 2, 2, 5, 32, 2, 59, 5, 6, 33, 12, 32, 6]; function sortFun1(ary) { var obj = {}, i = 0, len = this.length; for (; i < len; i++) { if (!obj[this[i]]) { obj[this[i]] = 1; ary.push(this[i]); } } return ary.sort(function (a, b) { return a - b }); } console.log(sortFun1(ary)); // [ 2, 2, 2, 2, 5, 5, 6, 6, 12, 12, 14, 32, 32, 33, 59 ]
var ary = [14, 12, 2, 2, 2, 5, 32, 2, 59, 5, 6, 33, 12, 32, 6]; function sortFun2(ary) { var i = 0, len = this.length; for (; i < len; i++) { if (ary.indexOf(this[i]) == -1) ary.push(this[i]); } return ary.sort(function (a, b) { return a - b }); } console.log(sortFun2(ary)); // [ 2, 2, 2, 2, 5, 5, 6, 6, 12, 12, 14, 32, 32, 33, 59 ]
var ary = [14, 12, 2, 2, 2, 5, 32, 2, 59, 5, 6, 33, 12, 32, 6]; function sortFun3(ary) { var i = 0, len = this.length; for (; i < len; i++) { if (this.indexOf(this[i]) == i) ary.push(this[i]); } return ary.sort(function (a, b) { return a - b }); } console.log(sortFun3(ary)); // [ 2, 2, 2, 2, 5, 5, 6, 6, 12, 12, 14, 32, 32, 33, 59 ]
var ary = [14, 12, 2, 2, 2, 5, 32, 2, 59, 5, 6, 33, 12, 32, 6]; function sortFun4(ary) { ary.sort(function (a, b) { return a - b }); var i = 0, len = this.length; for (; i < len; i++) { if (this[i] !== this[i - 1]) ary.push(this[i]); } return ary; } console.log(sortFun4(ary)); // [ 2, 2, 2, 2, 5, 5, 6, 6, 12, 12, 14, 32, 32, 33, 59 ]
接下来是网上比较少的效率比较了,也是本文重点,咱们先生成一个随机数组函数和计时函数统一比较
(舒适提示:随机数组执行一次以后就保存在一个变量,而每次执行函数花费时间都会有几毫秒误差,大家想看多几种结果就狠狠地按按F5就行了,也只能这么搞..)浏览器
首先生成一个一千个数字的数组dom
function sortFun1(ary) { var obj = {}, i = 0, len = this.length; for (; i < len; i++) { if (!obj[this[i]]) { obj[this[i]] = 1; ary.push(this[i]); } } return ary.sort(function (a, b) { return a - b }); } function sortFun2(ary) { var i = 0, len = this.length; for (; i < len; i++) { if (ary.indexOf(this[i]) == -1) ary.push(this[i]); } return ary.sort(function (a, b) { return a - b }); } function sortFun3(ary) { var i = 0, len = this.length; for (; i < len; i++) { if (this.indexOf(this[i]) == i) ary.push(this[i]); } return ary.sort(function (a, b) { return a - b }); } function sortFun4(ary) { ary.sort(function (a, b) { return a - b }); var i = 0, len = this.length; for (; i < len; i++) { if (this[i] !== this[i - 1]) ary.push(this[i]); } return ary; } function randomAry(n) { var ary = [], i = 0; for (; i < n; i++) { ary.push(Math.ceil(Math.random() * 10000)); } return ary; } function useTime(fn, ary) { var start = new Date(); fn(ary); var end = new Date(); console.log('本次函数运行花了:' + (end - start) + '毫秒'); } var ary = randomAry(1000000); useTime(sortFun1, ary); useTime(sortFun2, ary); useTime(sortFun3, ary); useTime(sortFun4, ary);
本次函数运行花了:1毫秒
本次函数运行花了:1毫秒
本次函数运行花了:0毫秒
本次函数运行花了:1毫秒
(嗯,果真现代浏览器强大无比,不吐槽旧浏览器了)函数
看看十万个数字测试
function sortFun1(ary) { var obj = {}, i = 0, len = this.length; for (; i < len; i++) { if (!obj[this[i]]) { obj[this[i]] = 1; ary.push(this[i]); } } return ary.sort(function (a, b) { return a - b }); } function sortFun2(ary) { var i = 0, len = this.length; for (; i < len; i++) { if (ary.indexOf(this[i]) == -1) ary.push(this[i]); } return ary.sort(function (a, b) { return a - b }); } function sortFun3(ary) { var i = 0, len = this.length; for (; i < len; i++) { if (this.indexOf(this[i]) == i) ary.push(this[i]); } return ary.sort(function (a, b) { return a - b }); } function sortFun4(ary) { ary.sort(function (a, b) { return a - b }); var i = 0, len = this.length; for (; i < len; i++) { if (this[i] !== this[i - 1]) ary.push(this[i]); } return ary; } function randomAry(n) { var ary = [], i = 0; for (; i < n; i++) { ary.push(Math.ceil(Math.random() * 10000)); } return ary; } function useTime(fn, ary) { var start = new Date(); fn(ary); var end = new Date(); console.log('本次函数运行花了:' + (end - start) + '毫秒'); } var ary = randomAry(100000); useTime(sortFun1, ary); useTime(sortFun2, ary); useTime(sortFun3, ary); useTime(sortFun4, ary);
如今开始出现明显差距了
本次函数运行花了:65毫秒
本次函数运行花了:4毫秒
本次函数运行花了:4毫秒
本次函数运行花了:5毫秒this
看看一百万个数字(数据庞大,开始吃不消了,等个五六秒吧)code
function sortFun1(ary) { var obj = {}, i = 0, len = this.length; for (; i < len; i++) { if (!obj[this[i]]) { obj[this[i]] = 1; ary.push(this[i]); } } return ary.sort(function (a, b) { return a - b }); } function sortFun2(ary) { var i = 0, len = this.length; for (; i < len; i++) { if (ary.indexOf(this[i]) == -1) ary.push(this[i]); } return ary.sort(function (a, b) { return a - b }); } function sortFun3(ary) { var i = 0, len = this.length; for (; i < len; i++) { if (this.indexOf(this[i]) == i) ary.push(this[i]); } return ary.sort(function (a, b) { return a - b }); } function sortFun4(ary) { ary.sort(function (a, b) { return a - b }); var i = 0, len = this.length; for (; i < len; i++) { if (this[i] !== this[i - 1]) ary.push(this[i]); } return ary; } function randomAry(n) { var ary = [], i = 0; for (; i < n; i++) { ary.push(Math.ceil(Math.random() * 10000)); } return ary; } function useTime(fn, ary) { var start = new Date(); fn(ary); var end = new Date(); console.log('本次函数运行花了:' + (end - start) + '毫秒'); } var ary = randomAry(1000000); useTime(sortFun1, ary); useTime(sortFun2, ary); useTime(sortFun3, ary); useTime(sortFun4, ary);
本次函数运行花了:661毫秒
本次函数运行花了:24毫秒
本次函数运行花了:20毫秒
本次函数运行花了:27毫秒对象
数听说话,排序