js面试题:关于数组去重的四种方法总结
2013-04-05 15:58
816 查看
在web前端面试题中,经常会出现这样一道题目:“请写一段函数,剔除数组中重复的元素。”
于是今天认真想了想,出了两个方案,性能方面都不理想,于是在大漠的qq群里面请教,网友Dino出了个方案,经过测试,性能很好,于是一起总结下:
测试环境:window 7 -firefox 19--firebug
方案一:obj属性判断除重法--性能最好,推荐!(虽然多了个obj,但比后面两个方案快多了)
方案二:在方案一的基础上把函数内的数组for()循环修改为了forEach() 循环,反而效率下降了。而且IE6、7、8不支持forEach()函数,尽管我们可以给他们打补丁来实现兼容
方案三:sort排序循环比对法---性能不太好(sort()性能不太好,循环比对次数也多,整体慢)
方案四:嵌套循环比对法--性能太差(浏览器直接卡死了)
虽然方案一的测试效果已经很理想了,但是函数中必经还有个冗余对象obj,应该还能优化,个人水平有限,各位看官如果还有比方案一更好的方案,记得分享一下呀!
于是今天认真想了想,出了两个方案,性能方面都不理想,于是在大漠的qq群里面请教,网友Dino出了个方案,经过测试,性能很好,于是一起总结下:
测试环境:window 7 -firefox 19--firebug
方案一:obj属性判断除重法--性能最好,推荐!(虽然多了个obj,但比后面两个方案快多了)
var aRandomNumberItems = function (n){ var result = []; for (var i = 0;i < n; i++){ var nRandom = Math.ceil(Math.random()*50); result.push(nRandom); } return result; }; var aRandomNumberItem1 = aRandomNumberItems(50000); console.time('time3'); Array.prototype.distinct3 = function () { var arr = [], obj = {}, len = this.length, result; for (var i = 0; i < len; i++) { result = this[i]; if (!obj[result]) { obj[result] = '1'; arr.push(result); } } return arr; } aRandomNumberItem1.distinct3(); console.timeEnd('time3');//结果为4ms }
方案二:在方案一的基础上把函数内的数组for()循环修改为了forEach() 循环,反而效率下降了。而且IE6、7、8不支持forEach()函数,尽管我们可以给他们打补丁来实现兼容
var aRandomNumberItems = function (n){ var result = []; for (var i = 0;i < n; i++){ var nRandom = Math.ceil(Math.random()*50); result.push(nRandom); } return result; }; var aRandomNumberItem1 = aRandomNumberItems(50000); console.time('time'); Array.prototype.distinct = function () { var arr = [], obj = {}; this.forEach(function (value,index){ if (!obj[value]){ obj[value] = 1; arr.push(value); } }) return arr; } aRandomNumberItem1.distinct(); console.timeEnd('time');//结果为28ms
方案三:sort排序循环比对法---性能不太好(sort()性能不太好,循环比对次数也多,整体慢)
var aRandomNumberItems = function (n){ var result = []; for (var i = 0;i < n; i++){ var nRandom = Math.ceil(Math.random()*50); result.push(nRandom); } return result; }; var aRandomNumberItem1 = aRandomNumberItems(50000); console.time('time1') Array.prototype.distinct1 = function () { this.sort(function (a,b) { return a-b; }) for (var i = 0; i < this.length-1; i++){ if (this[i] === this[i+1]){ this.splice(i+1,1); i--; } } return this; } aRandomNumberItem1.distinct1(); console.timeEnd('time1');//结果为1819ms,其中sort占用500ms
方案四:嵌套循环比对法--性能太差(浏览器直接卡死了)
var aRandomNumberItems = function (n){ var result = []; for (var i = 0;i < n; i++){ var nRandom = Math.ceil(Math.random()*50); result.push(nRandom); } return result; }; var aRandomNumberItem1 = aRandomNumberItems(200); console.time('time2'); Array.prototype.distinct2 = function () { for (var i = 0; i < this.length-2; i++){ var nNum1 = this[i]; for (var j = i + 1;j <this.length-1; j++){ var nNum2 = this[j]; if (nNum1 === nNum2){ this.splice(j,1); i--; } } } } aRandomNumberItem1.distinct2(); console.timeEnd('time2');//当数组length为50000的时候,浏览器直接卡死了,当length为200时,结果为1834ms,性能太差
虽然方案一的测试效果已经很理想了,但是函数中必经还有个冗余对象obj,应该还能优化,个人水平有限,各位看官如果还有比方案一更好的方案,记得分享一下呀!
相关文章推荐
- [js点滴]JavaScript关于数组的方法总结
- js数组合并方法 总结
- js数组去重的三种常用方法总结
- JS数组迭代方法总结
- JS中数组方法小总结
- 21、objective-c数组的四种遍历方法总结
- 总结几个jsvaScript 数组排序方法
- js与jquery常用数组方法总结
- js中文本和数组的方法总结
- JS关于字符串和数组的一些使用方法
- js数组去重的三种常用方法总结
- 关于JS中的数组的sort方法
- 关于Hive优化的四种方法总结
- JS学习之数组去重方法总结
- js 数组去重复的四种方法
- 关于数组的面试题总结(一)
- js数组去重的几种常用方法总结
- JS数组方法总结shift()、unshift()、pop()、push()、concat()、splice()、filter()、map()、some()、every()、forEach()等方法
- JS数组去重和排序方法总结
- 求js数组的最大值和最小值的四种方法