javascript中的数组方法

本文介绍了ES5中新增的五个重要数组方法:map(), reduce(), filter(), forEach(), some() 和 every()。详细讲解了每个方法的工作原理及其应用场景,帮助读者更好地理解和运用这些方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、es5的数组方法概述

在ES5中定了9个新的数组方法来遍历、映射、过滤、检测、简化和搜索数组。
大所属数组的方法的第一个参数接收一个函数,并且对数组的每个元素(或一些元素)调用一次该函数。如果是洗漱数组,对不存在的元素不调用传递的函数。在大多数情况下,调用提供的函数使用三个参数:数组元素、元素的索引和数组本身。通常,只需要第一个参数值。
大多数情况下,这些数组方法的第一个参数是一个函数,第二个参数是可选的。如果有第二个参数,则调用的函数被看做是第二个参数的方法,也就是说,在调用函数时传递进去的第二个参数作为它的this关键字的值来使用。
es5中的数组方法都不会修改它们调用的原始数组,当然,传递给这些方法的函数是可以修改这些数组的。(截取自《Javascript权威指南 第6版》)

二、ES5中的5中数组方法

1.map()

map()方法对于数组的每一个元素进行一个函数的运行,可以经过函数执行完毕后,把新的结果返回。

var arr = [1,2,3,4,5];
arr.map(function(x) {
    return x * x;
});
//[1,4,9,16,25]

也可以直接传入一个函数名,或者一个数据类型

arr.map(String);   //将数组元素转化为字符串
//['1','2','3','4','5']

传递给map()的函数应该有返回值,map()方法将调用的数组的每个元素传递给指定的函数,并返回一个新数组(不修改原数组

2.reduce()

使用指定的函数将数组元素及逆行组合,生成单个值。
reduce()方法需要两个参数:
第一个是必选参数,是一个执行化简操作的函数,这个函数必须接收两个参数。
化简参数的任务是用某种方法,把两个值组合或简化为一个值,并返回简化后的值。resuce()把结果就和序列的下一个元素做累积计算:
[x1,x2,x3].reduce(f) = f(f(x1,x2),x3);

第二个参数是可选参数,是一个传递给函数的初始值。当不指定函数的初始值时,它默认使用数组的第一个元素作为其初始值。
但在空数组上,不带初始值参数调用reduce()方法将导致类型异常。如果调用它的时候只有一个值(数组只有一个元素,并且没有指定初始值;或者是一个空数组,但指定了一个初始值),此时reduce()只是简单的返回那个值,不会去调用简化函数。

用reduce()求数组元素之积:

function sum(arr) {
    return arr.reduce(function(x,y) {
        return x * y;
    });
}

sum([1,2,3,4,5]);    //120
3.filter()

filter()用于把Array中某些元素过滤掉,然后返回剩下的元素。返回的数组元素是调用的数组的一个子集。
filter()把传入的函数依次作用于每个元素,传递的函数是用来做逻辑判定的,根据返回值是true还是false来决定保留还是丢弃该元素。

var arr = [1,2,3,4,5];
arr.filter(function(x) {
    return x > 3;
});
//[4,5]

filter()方法会跳过洗漱数组中缺少的元素,它的返回数组总是稠密的。为了压缩稀疏数组中的空缺或者删除undefined和null元素,可以使用filter()来实现。

var arr = [1,2,3,'',4,null,5];
arr.filter(function() {
    return true;
});
arr.filter(function(x) {
    return x !== undefined && x !== null;
});
4。forEach()

forEach()方法从头至尾遍历整个数组,为每个元素调用指定的函数。和reduce()一样,调用的函数有三个参数:数组元素,元素的索引,数组本身。一般只需要第一个参数。

var arr = [1,2,3,4,5];
arr.forEach(function(value,index,arr) {
    arr[index] = value + 5;
});
//[6,7,8,9,10]

但是forEach()方法无法再所有冤死都执行调用函数前终止遍历,即不能直接使用break,如果需要提前终止,必须把forEach()方法放在一个try快中,并抛出一个异常。

5.some()

在for()循环中,我们可以使用break来提前结束循环,但我们不能用for循环直接获取数组中的某个元素。一个快速的获取数组元素的方式是使用forEach()方法,但是这样我们就是去了break的能力。这种情况下,最接近的方法就是使用return来实现continue的功能

[1,2,3,4,5].forEach(function(val,index) {
    if(val === 2) {
        return true;    //停止遍历
    }
    console.log(val);
});

更好的方式是使用some()来结束循环。
some()方法用来检测某些元素是否满足所提供的函数,如果有任何一个数组元素调用函数的返回值为true,则返回该方法就true,并停止运行,不再继续遍历数组。

var isTrue = function(num) {
    return num > 5;
}

[1,2,3].some(isTrue);    //false
[4,5,6].some(isTrue);    //true

用return实现break的效果

[1,2,3,4,5].some(function(val,index) {
    if(val === 2) {
        return true;    //break;
    }
    console.log(val);    //1 true
});

也可以使用false来使循环continue到下一个元素。当返回true时。循环将会break,此时,some()将返回true

5.every()

every()和some()差不多,差别是,只有当数组的所有元素都返回true时,才会返回true。

[1,2,3,4,5].every(function(x) {
    reutrn x > 2;    //false
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值