求更有效率的代码 JS 数组 随机自动排序
网上查到一个方法(这个方法效率不高,不贴出代码了):
基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。
变化:因为数据有可能有重复,所以再使用一个数据来存储数组2中的数据序号,检验数据是否读取过时,改成比较数据序号。
于是按自己想法写了,加上多次改进(勉强达要求):
- JScript code
function ran_Arr_2(oArr) { var arrNum = []; var tArr = [];//新数组 var random_x; for(var i=oArr.length;i>0;i--) { random_x = Math.floor(Math.random()*i); // 取得一个随机数 arrNum.push(random_x);//压进位置 for(var j=0;j<arrNum.length-1;j++) { if( random_x >= arrNum[j]) random_x++; } tArr.push(oArr[random_x]); //压进数组 } return tArr; //返回新数组}function ran_Arr_3(oArr) { var oArr_copy = oArr.slice(0);//复制原数组 var tArr = [];//新数组 var random_x; for(var i=oArr.length;i>0;i--) { random_x = Math.floor(Math.random()*i); // 取得一个随机数 tArr.push(oArr_copy[random_x]); //压进数组 oArr_copy[random_x] = oArr_copy[i-1]; } return tArr; //返回新数组}function ran_Arr_4(oArr) { var temp_x; //临时交换数 var tArr = oArr.slice(0);//新数组,复制原数组 var random_x; for(var i=oArr.length;i>0;i--) { random_x = Math.floor(Math.random()*i); // 取得一个随机数 temp_x = tArr[random_x]; tArr[random_x] = tArr[i-1]; tArr[i-1] = temp_x; } return tArr; //返回新数组}
现求更有效率的代码:
[解决办法]
看不明白
“ 基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。 ”
数组1和2没有限定条件?比如长度?如果2大于永远也不会有结果................
[解决办法]
帮顶
[解决办法]
- JScript code
var a = [1, 2, 3, 4, 5, 6,7]; var b = [2, 6,10]; var isok = true; while (true) { isok = true; var lena = a.length; var lenb = b.length; if (lenb >= lena) { break; } var rand = Math.round(Math.random() * (lena-1)); for (var i = 0; i < lenb; i++) { if (b[i] == a[rand]) { isok = false; break; } } if (isok == true) { b.push(a[rand]); } } document.getElementById("div1").innerHTML =b.valueOf();
[解决办法]
路过
[解决办法]
基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。
给我的感觉你的意思就是比较两个数组arr1,arr2,如果arr2中没有arr1的数据,就是当前arr1的数据写入arr2中,并且arr2的长度不能大于arr1的长度,并没有存在排序的问题?!
- JScript code
var arr1 = [1,2,3,5,6,8,9]; var arr2 = [4,6]; function addSome(arr1,arr2){ if(arr1==null||arr1.length==0) return []; if(arr2==null||arr2.length==0) return arr1; var length = arr2.length; var obj = new Object(); for(var i=0; i<length; i++){ eval("obj.pop" + arr2[i] + "='" + arr2[i] + "';"); } var l = arr1.length; for(var i=0;i<l;i++) { if(eval("typeof obj.pop" + arr1[i] + "=='undefined'")){ arr2.push(arr1[i]); } if(arr2.length==l){ break; } } return arr2.sort(); //如果要排序的话,再加上sort } var t = addSome(arr1,arr2); alert(t);
------解决方案--------------------
- JScript code
<script language="javascript">Array.prototype.unique2 = function(){ for(var a={}, b={}, i=0, n=this.length; i<n; i++){ if(typeof(b[this[i]])!="undefined") continue; if(typeof(a[this[i]])=="undefined") a[this[i]] = 1; else{ b[this[i]]=1; delete a[this[i]] } } this.length=0; for(i in a) this[this.length] = i; return this; }; var a1 = new Array(1,2,3,4,5,6,7,8,9);var a2 = new Array(2,3,4,5,6,7);var c = a1.concat(a2).unique2();var d = a2.concat(c).unique2();alert(d);//你要的结果//至于d数组不能超过a1数组的长度,自己做下处理好了</script>
[解决办法]
学习
[解决办法]
现在才明白你的意思,那么大的数据量,然后随机排序。。
光for (var j=0;j<1000000;j++) { xx.push(j) }这句花费的时间就不少了 =。=
如果这样,为什么不直接重新随机生成下数组呢?!
[解决办法]
- JScript code
var a = [1,2,3,5,6,8,9];alert(a.sort(function(){ return 0.5 > Math.random();}));
[解决办法]
我测的数据在10000000,用你的方法
ran_Arr 154.29%2675.891ms2675.891ms 2675.891ms 2675.891ms 2675.891ms
renderArr 145.7%2252.419ms2252.419ms2252.419ms2252.419ms 2252.419ms
- JScript code
function renderArr(arr){ var _arr = arr; var temp,random; var length = arr.length; while(length){ random = Math.floor(Math.random()*length); temp = _arr[random]; length--; _arr[random] = _arr[length];_arr[length] = temp; } return _arr; }
[解决办法]
[解决办法]
LZ有必要把1000条以上的数据交给客户端来处理吗
JS的性能在高,相对服务器来讲还是很低
[解决办法]
- JScript code
<script type='text/javascript'>var arr = [1,2,3,4,5,6,7,8,9];var len = arr.length;while(len--){ var k = Math.round(Math.random()*len) arr[len] = [arr[k],arr[k]=arr[len]][0]}alert(arr);</script>
[解决办法]
mark !
[解决办法]
lihai