(准备面试,多看点题。来自雨夜带刀's Blog)html
需求描述:从一组有序的数据中生成一组随机而且不重复的数,相似于简单的抽奖程序的实现。
先来生成一个有序的数组:面试
var arr = [], length = 100, i = 0; for( ; i < length; i++ ){ arr.push( i ); }
从一个长度为 100 的有序数组中随机拿出 10 个随机的数,而且不能有重复。数组
var gRandomArr = function( arr, length ){ var newArr = [], i = 0, index; for( ; i < length; i++ ){ // 利用数组长度生成随机索引值 index = parseInt( Math.random() * arr.length ); // 将随机索引对应的数组元素添加到新的数组中 newArr.push( arr[index] ); // 删除原数组中随机生成的元素 arr.splice( index, 1 ); } return newArr; }; // 调用 gRandomArr( arr, 10 );
方法1主要是采用基于数组自己的长度去生成随机的索引值,而后将索引值对应的数组元素添加到随机数组中,因为不能有重复,在添加好后将删除原数组的元素。dom
var gRandomArr = function( arr, length ){ // 使用sort将原数组的顺序打乱,让有序变成无序 arr.sort(function(){ return Math.random() - 0.5; }); // 从原数组中一次性返回10个元素 return arr.slice( 0, length ); }; // 调用 gRandomArr( arr, 10 );
方法2采用的办法是先打乱原数组的顺序,但这里须要用到 sort 来对原数组进行排序,若是数组长度较大的话,sort 排序的性能损耗会更大,由于须要遍历整个数组,而随机抽取的话,不须要对整个数组进行遍历,故其性能会更好。性能