HTML笔记 ·

JavaScript中Array数组的几种方法

涉及到数组的问题,以前基本上我们都是采用for循环的方法来进行遍历,后来在ES5中新增了几种方法来方便我们遍历。这几种方法分别为:forEach(js v1.6) ,map(js V1.6),filter (js v1.6),some(js V1.6),every(js V1.6),indexOf(js V1.6),lastIndexOf(js V1.6),reduce(js V1.8),rceRight(js V1.8)。

对于让人失望很多次的IE6-IE8浏览器,如果你想兼容的话,可以通过Array原型扩展实现以上全部功能。

// 对于古董浏览器,如IE6-IE8

if (typeof Array.prototype.forEach != "function") {
  Array.prototype.forEach = function () {
    /* 实现 */
  };
}

下面详细介绍一下各方法的用处。

forEach()

forEach是Array新方法中最基本的一个,就是遍历,循环。例如下面这个例子

var data = [1,2,3,4,5];
var sum = 0;
data.forEach(function(value){ //只使用了第一个参数(函数),调用的函数也只使用了第一个参数数组元素
 sum += value;
});
 
console.log(sum);//15
console.log(data);// [1, 2, 3, 4, 5]
var data = [1,2,3,4,5];
var sum = 0;
data.forEach(function(value,item,data){ //调用的函数具有了三个参数
  data[item] = value*value; //取平方
});
 
console.log(data);// [1, 4, 9, 16, 25]

上面的这两个例子里可以看出,forEach方法中的function回调支持3个参数,第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身。

map()

这个方法将调用的数组中每个元素传递给指定的函数,并返回一个数组,它包含这个函数的返回值

var data = [1,2,3,4,5];
var data1 = data.map(function(value){
 return ++ value;
});
 
console.log(data); // [1, 2, 3, 4, 5]
console.log(data1);// [2, 3, 4, 5, 6]

当然这个方法可以替代for循环遍历数组元素,进行数据操作

filter()

这个方法返回的数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的,该函数返回true或false。

如果返回值是true或者能转化为true的值,那么传递给判定函数的元素就是这个子集的成员,它将被添加到一个作为返回值的数组中。

var data = [1,2,3,4,5];
var data1 = data.filter(function(value){
 return value <= 3;
});
 
var data2 = data.filter(function(value){
 return value > 3;
});
 
console.log(data); // [1, 2, 3, 4, 5]
console.log(data1);// [1,2,3]
console.log(data2);// [4,5]

every()和some()

every和some均是对数据进行筛选,不同的是every是对所有元素进行筛选,必须该数组都符合要求才返回true,否则返回false。而some不同的是只要筛选到符合条件的就直接返回true,不再进行后续元素的筛选。

var data = [1,2,3,4,5];
var data1 = data.every(function(value){
 return value < 4;
});
 
var data2 = data.some(function(value){
 return value >4;
});
 
console.log(data); // [1, 2, 3, 4, 5]
console.log(data1);// false
console.log(data2);// true

reduce()和reduceRight()

这两个方法使用指定的函数将数组元素进行组合,生成单个值。

reduce()有两个参数。第一个是执行化简操作的函数,就是说用某种方法把两个值化简为一个值,并返回化简后的值。

第二个参数可选,用来传递给第一个参数函数作为初始值。如果第二个参数没有,则初始值就使用数组的第一个元素值。

var data = [1,2,3,4,5];
var sum = data.reduce(function(a,b){
 return a+b;
});
 
var sum1 = data.reduce(function(a,b){
 return a+b;
},5);
 
var min = data.reduce(function(a,b){
 return (a<b)?a:b;
});
 
console.log(data); // [1, 2, 3, 4, 5]
console.log(sum);// 15
console.log(sum1);// 20
console.log(min);// 1

sum中没有第二个参数,所以初始值为第一个数组元素,第一步1+2=3,第二步3+3=6... 最后得15
sum1中有第二个参数,所以初始值为5,第一步5+1=6,第二步6+2=8... 最后得20

reduceRight()和reduce()差不多,不同的是它按照数组索引从高到低(从右到左)处理数组,而不是正常的从低到高。

var data = ['a','b','c']; 
var str = data.reduce(function(x,y){ //顺序
 return x+y;
});
 
var str1 = data.reduceRight(function(x,y){ //逆序
 return x+y;
});
 
console.log(data);// [1, 2, 3]
console.log(str);//"abc"
console.log(str1);//"cba"

indexOf()和lastIndexOf()

这个方法搜索整个数组中具有给定值的元素,返回找到的元素的索引(找到了一个就退出了),没有找到则返回-1.

一个从头至尾,一个从尾至头

var data = ['a','b','a','c','a']; 
 
console.log(data.indexOf('a')); //0
console.log(data.indexOf('d')); //-1
console.log(data.lastIndexOf('a'));//4
 
console.log(data.lastIndexOf('a',-2));//2 从倒数第二个开始
console.log(data.lastIndexOf('a',1));//0  从顺序第二个往前

 

参与评论