美文网首页🐋成员文章
JavaScript基础学习-数组中的常用遍历方法

JavaScript基础学习-数组中的常用遍历方法

作者: 不是王小贱 | 来源:发表于2017-02-16 17:55 被阅读11次

    数组常用的遍历方法

    这几个方法都不会改变原数组。这些方法只有在实际应用中才能体会到它们的强大作用,这里只是罗列它们的一些知识点。

    forEach() IE6-8不兼容

    • 用来遍历数组中的每一项;
    • 参数
      • 1.回调函数 forEach(function(item,index,list))
      • 2.上下文(改变回调函数中的this指向)
    • 返回值:没有
    • 原有数组不会改变

    理论上是没有返回值的,仅仅是对数组进行遍历,不会改变数组。但是可以通过索引来改变原有的值
    无法直接退出循环,只能使用return来达到for循环中continue的效果。

    回掉函数中的作用

    会传递三个参数

    • item 数组中的当前项
    • index 当前项的索引index
    • 原始数组 input

    执行次数

    • 数组中有几项,那么传递进去的匿名回调函数就会执行几次

    map() IE6-8不兼容

    和forEach非常类似,但是map的回调函数中支持返回值:return的是啥,相当于把数组中的这一项变为啥

    • 该方法就支持返回值了。可以理解为map是映射的关系,将一个数组中的每一项做一个转换,结果生成一个新数组,并且新数组的长度和原数组一样
    • 该方法可以应用于改变原数组中的某一项,通过条件判断替换掉原有项
    • 被替换的那一项,不一定是原来的数据类型。可以随意替换已有的数据类型。
    • 例如:将后台传递过来的数据,生成HTML结构,这时就可以舍弃字符串拼接。可以直接运用该方法,就每一项数据映射成一条HTML语句。
    • 在回调函数中,如果没有返回值,则得到的是undefined
    • 用法
        var num = 3;
    var obj = {name:100};
    var arr = [{name:1},{name:3},{name:2},{name:3}];
    var newArr = arr.map(function (item,index) {//返回成一个新的数组
        if(item.name == num){ //如果当前项找到了,将最新的对象返回替换掉原有的
            return obj;
        }
        return item;
    }); 
    

    filter() 过滤 ES5

    该方法可以看作是过滤,按照某规则提取出一些特定的项来,生成一个新数组,但新数组的长度小于或等于原数组

    • callback将数组元素当参数传入,并返回一个布尔值。当返回值为真时,该元素被假如到新的数组中,否则就被过滤掉,不会出现在新数组中。常用来当作删除使用。
    • ,根据已知的条件,把与已知条件相关的数据进行处理。在遍历过程中,如果找到与已知条件相符合的数据,返回true 就是保留该数据;返回false就是删除数据。执行完该方法后,会返回一个新的数组,不改变原数组。
    • 用法
        var num = 3;
    var arr = [{name:1},{name:3},{name:2},{name:3}];
    //filter 过滤 如果在filter函数中返回true表示保留,返回false删除,
    var newArr = arr.filter(function (item,index) {
        return item.name != num;
    });
    //会返回一个新的数组
    

    find() 查找 ES6

    find方法对数组中的每一项元素执行一次callback函数,直到有一个callback返回true,就会停止执行。意味着,只要找到符合条件的那一项,返回true。并把这一项的值返回。就不再查找了

    • 该方法可以用来对一组数据中具有某个属性值,进行判断。如果整个数组有这个属性值,将要做什么。只要有一个不是,又要做什么。例如,购物车中的全选和非全选,只要有一个没有被选中,全选的checkbox就不能打√,如果全都选中,就打上√
    • 用法
        //查询(find)  findOne 查到一项后返回当前项 不继续查找
    var num = 3;
    var arr = [{name:1},{name:3,age:100},{name:2},{name:3}];
    //返回找到的那一项
    var obj = arr.find(function (item,index) {
        //找到后返回true即可
        if(item.name ==num){
            return true;//返回true则会将当前item返回
        }
    });
    

    findIndex()es6

    和find方法一样,只是返回不一样,find返回的当前符合条件的元素,而findIndex返回的是符合条件的元素的索引。

    every()方法

    方法使用传入的函数测试所有的元素,只要其中有一个函数返回值为false,那么该方法的结果为false;如果全部返回true,那么该方法的结果才为true.

    some()方法

    与every()方法正好相反,some测试数组元素时,只要有一个函数返回值为true,则该方法返回true,若全部返回false,则该方法返回false。

    reduce()方法

    reduce()方法接受一个方法作为累加器,数组中的每一值(从左到右)开始合并,最终为一个值

    语法:arr.reduce(fn, initialValue)

    fn 表示在数组每一项上执行的函数,接受四个参数:

    • previousValue上一次调用回调返回的值,或者提供的初始值;
    • value数组中当前被处理元素的值
    • index当前元素在数组中的索引
    • array原数组

    initialValue指定第一次调用fn的第一个参数。

    当fn第一次执行时:

    • 如果initialValue在调用reduce时被提供,那么第一个previousValue将等于initalValue,此时item等于数组中的第一值;
    • 如果initailValue未提供,那么previousValue等于数组中的第一个值,item等于数组中的第二个值。此时如果数组为空,那么将抛出TypeError
    • 如果数组仅一个元素,并且没有提供viitalValue,或提供了initialValue但数组为空,那么fn不会被执行,数组的唯一值将被返回
      var ary = [3,4,5,6];
      var res = ary.reduce(function (pre,value,index,array) {
        return pre+value
    },1);
    console.log(res);// 19
    
    const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck', 'pogostick'];
        const transportation = data.reduce(function(obj, item) {
            if (!obj[item]) {
                obj[item] = 0;
            }
            obj[item]++;
            return obj;
        }, {});
        console.log(transportation);
    

    reduceRight

    与reduce一致,只是累加的方向该为从右往左累加

    entries(ES6)

    返回一个数组迭代器对象,该对象包含数组中每个索引的键值对;

    语法:arr.entries()

    var ary = [1,2,3,4,5];
    var res = ary.entries();
    console.log(res.next()); // { value: [ 0, 1 ], done: false }
    console.log(res.next().value);// [ 1, 2 ]
    

    keys(ES6)

    返回一个数组索引的迭代器,类似于entries,只是返回的都是索引。

    相关文章

      网友评论

      本文标题:JavaScript基础学习-数组中的常用遍历方法

      本文链接:https://www.haomeiwen.com/subject/oiyhwttx.html