zoukankan      html  css  js  c++  java
  • ECMAScript5(ES5)标准中扩展的数组Array方法

    迭代forEach()

    这是ES5数组方法中最基本的一个了 
    也非常的简单,就是遍历、循环 
    我们传统的数组循环方法是这样的

    var arr = [1, 2, 3, 4, 5];
    for(var i = 0, len = arr.length; i < len; i++){
        console.log(arr[i]);
    }
    //1 2 3 4 5

    forEach()第一个参数是一个回调函数 
    对于数组的每一个元素,它都会执行这个回调函数 
    而且这个回调函数有默认的参数 
    分别是数组元素、数组索引、数组引用 
    数组引用就是数组自身的引用 
    (这个参数顺序与下面的map()、filter()、some()、every()都是一样的) 
    看下面这个例子就明白了

    ['a', 'b', 'c', 'd', 'e'].forEach(console.log);

    控制台打印如下 

    我们也可以把这个写的更直白一些

    ['a', 'b', 'c', 'd', 'e'].forEach(function(value, index, arr){
        console.log(value, index, arr);
    });
    • 1
    • 2
    • 3

    所以我们一般就是这样使用这个方法的

    [].forEach(function(value, index, arr){
        ...
    });

    不过要特别注意,这个回调函数中参数的顺序与jQuery是不同的 
    下面是jQuery中的each()方法使用

    $.each(function(index, value, arr){
        ...
    });

    forEach()方法中还有一个可选的上下文参数 
    就是回调函数中的this指向 
    (map()、filter()、some()、every()同样有) 
    举个例子

    var group = {
        member: ['a1', 'a2', 'b1', 'b2', 'c1', 'c2'],
        isActive: function(member){
            return /1$/.test(member);
        },
        active: function(member){
            if(this.isActive(member)){
                console.log(member + '是活跃成员');
            }
        }  
    }
    group.member.forEach(group.active, group);

    在这个例子中,就必须手动将回调函数的this设置为group 
    否则的话,将会是window对象(浏览器中) 
    (严格模式下是undefined)

    映射map()

    映射方法map()的参数与循环方法forEach()是一样的 
    一个回调函数和一个可选的上下文参数 
    包括回调函数的参数顺序也一样(肯定一样) 
    所谓映射不难理解,在我们的数学中都学过 
    类似于C++的STL标准库中的map

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

    这个例子中将一个数组中所有元素求平方得到一个新数组 
    不过既然要使用映射函数map() 
    就必须要用return返回值 
    返回的值就是新数组中映射的值 
    (否则就相当于使用了forEach(),还返回了一个全是undefined的数组)


    至于上下文参数就不多做解释了 
    上面在forEach()中已经说过了

    筛选filter()

    用法与map()相似 
    同样返回一个新数组(同样有一个可选的上下文参数) 
    不过是过滤掉“不合格”的元素 
    如果在回调函数中返回true,那么就留下来 
    返回false,就扔掉

    var arr = [5, 20, 24, 66, 40, 49, 60];
    var newArr = arr.filter(function(value){
        return value % 10 == 0;
    });
    console.log(newArr); //[20, 40, 60]

    我筛选出了数组中整十的数字 
    再举个例子,筛选奇数索引(相对于我们来说的奇数索引)

    var arr = [5, 20, 24, 66, 40, 49, 60];
    var newArr = arr.filter(function(value, index){
        return index % 2 == 0;
    });
    console.log(newArr); //[5, 24, 40, 60]

    这里要注意 
    返回的值不必是严格的布尔值 
    返回值可以通过类型转换转化为布尔值进行判断

    存在满足判断some()

    这个方法返回布尔值 
    只要有至少一个满足条件就返回true 
    (至少一个返回true) 
    否则返回false

    var arr = [5, 20, 24, 66, 40, 49, 60];
    var flag = arr.some(function(value){
        return value % 10 == 0;
    });
    console.log(flag); //true

    由于存在整十的元素,所以结果返回true

    var arr = [5, 20, 24, 66, 40, 49, 60];
    var flag = arr.some(function(value){
        return value % 100 == 0;
    });
    console.log(flag); //false

    由于不存在整百的元素,所以结果返回false

    全部满足判断every()

    与上面的some()是好兄弟 
    它更加严格 
    必须全部满足条件才会返回true 
    (全部返回true)

    var arr = [5, 20, 24, 66, 40, 49, 60];
    var flag = arr.every(function(value){
        return value % 1 == 0;
    });
    console.log(flag); //true

    由于对于数组的全部元素 
    都是1的倍数 
    所以返回true

    索引查寻indexOf()与lastIndexOf()

    早在ES3字符串就存在方法indexOf()方法 
    它们功能是一样的 
    第一个参数表示你要查找的元素 
    第二个参数可选,表示你要从第几位开始查找(索引) 
    第二个参数不填写就是默认从头开始查找 
    返回第一个找到的索引位

    var arr = [10, 20, 30, 40, 50, 60];
    var index = arr.indexOf(30);
    console.log(index); //2

    最终找到了30所在的索引位置2

    var arr = [10, 20, 30, 40, 50, 60];
    var index = arr.indexOf(30, 3);
    console.log(index); //-1

    现在加一个参数3 
    表示从索引3开始查找 
    最终没有查找到元素,结果返回-1


    lastIndexOf()是从后往前进行查找

    var arr = [10, 20, 30, 40, 50, 60];
    var index = arr.lastIndexOf(30, 3);
    console.log(index); //2

    修改为lastIndexOf()方法后 
    由于是从后向前查找,可以得出结果

    浓缩reduce()与reduceRight()

    不知道该怎样描述这两个方法 
    觉得“浓缩”这层意思更符合它的功能 
    它有点类似于递归 
    它的作用就是不断的减少数组元素,最终的到一个结果 
    这个方法稍微复杂一些 
    它的第一个参数同样是一个回调函数;第二个参数可选,表示初始值 
    但是它回调函数的参数与上面的有些不同 
    分别是之前值、当前值、数组索引、数组引用 
    (看了下面就明白了)


    先来看一下没有初始值的情况 
    计算数组元素的积 
    (pre表示previous之前值,cur表示current当前值)

    var arr = [1, 2, 3, 4];
    var result = arr.reduce(function(pre, cur){
        return pre * cur;
    });
    console.log(result); //24

    没有初始值时,数组的第一个元素就是初始值 
    那么第一次走回调函数 
    之前值(初始值)是1,当前值是2 
    回调函数返回乘积结果是2 
    第二次走回调函数的时候 
    之前值是2(上一次的返回结果),当前值是3 
    于是以此类推,最终得到了数组元素的乘积

    //伪代码
    
    //第一次迭代:
    pre = 1, cur = 2, return 1 * 2 = 2
    //第二次迭代:
    pre = 2, cur = 3, return 2 * 3 = 6
    //第三次迭代:
    pre = 6, cur = 4, return 6 * 4 = 24
    //结果
    return 24

    有了初始值,那么第一次走回调函数时 
    指定的初始值就是之前值 
    数组的首个元素就是当前值

    var arr = [1, 2, 3, 4];
    var result = arr.reduce(function(pre, cur){
        return pre * cur;
    }, 10); <--
    console.log(result); //240

    这里我指定了初始值10 
    于是结果发生了改变

    //伪代码
    
    //初始值设置
    pre = initialValue = 10
    //第一次迭代:
    pre = 10, cur = 1, return 10 * 1 = 10
    //第二次迭代:
    pre = 10, cur = 2, return 10 * 2 = 20
    //第三次迭代:
    pre = 20, cur = 3, return 20 * 3 = 60
    //第四次迭代:
    pre = 60, cur = 4, return 60 * 4 = 240
    //结果
    return 240

    这也相当于下面的代码

    var arr = [10, 1, 2, 3, 4]; <--
    var result = arr.reduce(function(pre, cur){
        return pre * cur;
    });
    console.log(result); //240

    reduceRight()便是从右向左“浓缩” 
    用法和reduce()是一样的 
    下面的方法是利用这个方法计算 (2^3)^4

    var arr = [4, 3, 2];
    var result = arr.reduceRight(function(pre, cur){
        return Math.pow(pre, cur);
    });
    console.log(result); //4096
    • 迭代 array.forEach(callback[, thisObject]);
    • 映射 array.map(callback[, thisObject]);
    • 筛选 array.filter(callback[, thisObject]);
    • 存在 array.some(callback[, thisObject]);
    • 全部 array.every(callback[, thisObject]);
    • 索引 array.indexOf(searchElement[, fromIndex]);
    • 索引 array.lastIndexOf(searchElement[, fromIndex]);
    • 浓缩 array.reduce(callback[, initialValue]);
    • 浓缩 array.reduceRight(callback[, initialValue]);

    其中forEach()、map()、filter()、some()、every()、indexOf()、lastIndexOf() 
    的callback参数分别为value、index、array 
    reduce()和reduceRight() 
    的callback参数分别为previous、current、index、array

      原创网址 https://blog.csdn.net/q1056843325/article/details/53907994

  • 相关阅读:
    【BZOJ4448】【SCOI2015】情报传递
    【BZOJ2006】【NOI2010】超级钢琴
    NOIp2018模拟赛四十五~??
    【BZOJ4940】【YNOI2016】这是我自己的发明
    数据迁移—datax
    DG模拟GAP手动处理
    DG问题:ORA-16416: No viable Physical Standby switchover targets available
    管理和维护DG
    DG问题
    DG概念与机制
  • 原文地址:https://www.cnblogs.com/huaifeidejiushu/p/9035314.html
Copyright © 2011-2022 走看看