【优化】数组去重
2010-03-12 22:23 BlueDream 阅读(972) 评论(0) 编辑 收藏 举报用hash代替数组.下面代码可直接拷贝测试:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> 数组去重复 </title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> #contentHS, #contentAR { width: 1000px; height: 180px; } div { width:100px; height: 25px; background-color: #009900; font-size:12px; line-height: 25px; text-align: center; } #resultHS,#resultAR { width: 1000px; height: 40px; } #contentHS, #resultHS { border: 1px solid #FFCC66; background-color: #FFFFCC;} #contentAR, #resultAR { border: 1px solid #00CC00; background-color: #CEFFCE;} </style> </head> <body> <div onclick="uniStart();">测试开始</div><br/> <textarea id="contentHS"></textarea><br/><br/> <textarea id="resultHS"></textarea><br/><br/> <textarea id="contentAR"></textarea><br/><br/> <textarea id="resultAR"></textarea> <script type="text/javascript"> function uniStart() { /* 生成1000个英文字符 */ var array1 = new Array(); var array2 = new Array(); for(var i = 0; i < 1000; i++) { array1[array1.length] = String.fromCharCode(Math.floor(Math.random()*26)+97); array2[array2.length] = String.fromCharCode(Math.floor(Math.random()*26)+97); } document.getElementById('contentHS').value = '测试1000字符数组: ' + array1; document.getElementById('contentAR').value = '测试1000字符数组: ' + array2; /* 方法一 Hash */ function hash_unique(array) { var o = {}; for(var i = 0, j = 0; i < array.length; i++) { if(typeof o[array[i]] == 'undefined') { o[array[i]] = j++; } } array.length = 0; for(var k in o) { array[o[k]] = k; } return array; } /* 方法二 数组 */ function array_unique(array) { if (array.length < 2) return [array[0]] || []; var arr = []; for (var i = 0; i < array.length; i++) { arr.push(array.splice(i--, 1)); for (var j = 0; j < array.length; j++) { if (array[j] == arr[arr.length - 1]) { array.splice(j--, 1); } } } return arr; } var HS = document.getElementById('resultHS'), AR = document.getElementById('resultAR'); // 方法一测试开始 var d = new Date().getTime(); HS.value = 'HASH去重结果: ' + hash_unique(array1); d = new Date().getTime() - d; HS.value += '\r1000节点耗时: ' + d + '毫秒!'; // 方法二测试开始 var d2 = new Date().getTime(); AR.value = 'Array去重结果: ' + array_unique(array2); d2 = new Date().getTime() - d2; AR.value += '\r1000节点耗时: ' + d2 + '毫秒!'; } </script> </body> </html>
可见用hash比用array筛选快的不是一个数量级