js数组算法总结

来源:互联网 发布:淘宝上买药品不能付款 编辑:程序博客网 时间:2024/06/05 11:05
//数组去重
//方法一:利用数组的indexOf方法
function unique(arr){
var result = [];
for(var i=0;i<arr.length;i++){
if(result.indexOf(arr[i]) == -1){
result.push(arr[i]);
}
}
return result;
}


//方法二:利用hash表
//注意,var a = [1,2,3,4,'3',5]会返回[1,2,3,4,5]
function unique(arr){
var hash = {},
result = [];
for(var i=0;i<arr.length;i++){
if(!hash[arr[i]]){
hash[arr[i]] = true;
result.push(arr[i]);
}
}
return result;
}


//方法三:排序后比较相邻,如果一样则放弃,否则加入到result
//注意:如果数组中出现1,1,'1'这样的情况,则会出错
function unique(arr){
arr.sort();
var result = [arr[0]];
for(var i=1;i<arr.length;i++){
if(arr[i] !== arr[i-1]){
result.push(arr[i]);
}
}
return result;
}


//方法四
//效率低,但不会出现方法二和方法三出现的BUG
function unique(arr){
if(arr.length == 0){
return;
}
var result = [arr[0]] , isRepeate;
for(var i=0;i<arr.length;i++){
isRepeate = false;
for(var k=0;k<result.length;k++){
if(result[k] === arr[i]){
isRepeate = true;
break;
}
if(k == result.length){
break;
}
}
if(!isRepeate){
result.push(arr[i]);
}
}
return result;
}


//方法五:充分利用了递归和indexOf方法
var unique = function(arr,newArr){
var num;
if(arr.indexOf(num = arr.shift()) == -1){
newArr.push(num);
}
arr.length && unique(arr,newArr);
}


//数组顺序扰乱
//方法一
function shuffle(array){
var copy = [],
n = array.length,
i;
//如果还剩有元素则继续
while(n){
i = Math.floor(Math.random() * array.length);
if(i in array){
copy.push(array[i]);
delete array[i];
n--;
}
}
return copy;
}


//方法二:跟方法一类似,通过splice来去掉原数组已选项
function shuffle(array){
var copy = [],
n = array.length,
i;
//如果还剩有元素则继续
while(n){
i = Math.floor(Math.random() * n--);
copy.push(array.splice(i,1)[0]);
}
return copy;
}


//方法三
//前面随机抽数依次跟末尾的数交换,后面依次前移,即:第一次前n个数
//随机抽一个跟第n个交换,第二次前n-1个数跟第n-1个交换,依次类推
function shuffle(array){
var m = array.length,
t , i;
while(m){
i = Math.floor(Math.random() * m--);
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}


//数组判断
//自带的isArray方法
var array6 = [];
Array.isArray(array6); //true


//利用instanceof运算符
var array5 = [];
array5 instanceof Array; //true


//利用toString的返回值
function isArray(o){
return Object.prototype.toString.call(o) === '[object Array]';
}


//数组求交集
//利用filter和数组自带的indexOf方法
array1.filter(function(n){
return array2.indexOf(n) != -1;
});


//数组求并集
//原理:连接两个数组并去重
function arrayUnique(array){
var a = array.concat();
for(var i=0;i<a.length;++i){
for(var j=i+1;j<a.length;++j){
if(a[i] === a[j]){
a.splice(j--,1);
}
}
}
return a;
}


//数组求差集
Array.prototype.diff = function(a){
return this.fliter(function(i){
return a.indexOf(i) < 0;
})
}


数组排序sort()方法:
该方法会将数组中的元素按照字符编码的顺序进行排序(字母顺序)
如果需要对数值大小进行排序,需要使用一个排序函数
例子:
function sortNumber(a,b){
return a - b;
}
var arr = ["10","5","40","25","1000","1"];
document.write(arr.sort(sortNumber));
//1,5,10,25,40,1000


concat()方法用于连接两个或多个数组
例子:
var a = [1,2,3];
document.write(a.concat(4,5));
//1,2,3,4,5
或者
a.concat(arr2,arr3);


shift()方法用于删除数组中的第一个元素,并返回第一个元素的值
例子:
arr.shift();
注意:该方法不会创建新数组,而是直接修改原有的数组
与之相反的是pop()方法,删除并返回数组的最后一个元素


取任意范围值的随机数公式:
parseInt(Math.random()*(max-min+1)+min,10);
Math.floor(Math.random()*(max-min+1)+min);


splice()方法向数组中添加/删除项目,然后返回被删除的项目
splice(位置,长度(为0的话不会删除),添加的新项目)
例子:
var a = [1,2,3,4,5];
a.splice(1,0,100); //1,100,2,3,4,5
a.splice(1,1,100); //1,100,3,4,5
a.splice(1,2); //1,4,5
注意:该方法直接操作原数组


slice()方法从已有数组中返回选定的元素
slice(开始位置(如果是负数,从尾部开始算起,-1代表最后一个元素),结束位置)
例子:
var a = [1,2,3,4,5];
a.slice(1,4); //2,3,4
//从下标为1的元素开始,到下标为4的前一个元素结束,注意这里指的不是长度

注意:该方法是返回一个新数组,不操作原数组


split()方法拆分字符串生成数组

var str = 'kong jun chao';

var arr = str.split(' '); //分隔字符串空格,生成数组

//arr = ['kong','jun','chao']


map()和forEach()类似,对数组中的每个元素使用某个函数

区别:map()返回新数组,forEach()操作原来数组

function add(obj){

return obj+=5;

}

var arr = [1,4,8];

var newArr = arr.map(add);

//newArr = [6,9,13]


join()和toString()方法将数组转化为字符串

var name = ['kk','hh','ff'];

var str = name.join(' ');

//kk hh ff

var str = name.toString();

//kk,hh,ff

注意:join()可以指定以什么隔开每个元素,而toString()只能是以逗号隔开


filter()和every()方法过滤数组

参数中传入一个返回值为布尔类型的函数

//判断是否是奇数

function isOdd(num){

return num%2 != 0;

}

var arr = [1,2,3,4];

var newArr = arr.filter(isOdd);

//newArr = [1,3];

//也可以搭配使用indexOf()过滤字符串

every()方法最后只会返回一个布尔值,当数组中的每一项都返回true时,则会返回true,否则返回false


push()和unshift()方法添加数组元素

push()添加在数组最后一个元素

unshift()添加在数组第一个元素

0 0