2、Array

作者: 示十 | 来源:发表于2019-07-22 20:15 被阅读0次

    MDN官方文档

    数组声明方式

    1、Array构造函数

    new Array(); // 声明一个空数组  undefined
    new Array(3); // 声明包含3项的数组 undefined,undefined,undefined
    new Array('hello', 'world');
    

    new 关键字可省略

    Array(3)
    

    2、数组字面量
    比较常用的方法,使用这种方式不会调用Array的构造函数(和调用构函数会有什么区别呢???)

    var arr = [];
    var colors= ['red', 'green', 'blue'];
    

    由于不同浏览器表现不同,尽量不要在数组中出现空位

    var arr = ['red', , ];  // 强烈不建议这种语法
    

    数组的访问方式

    var colors= ['red', 'green', 'blue'];
    colors[0]; // red
    

    数组长度 length

    console.log(colors.length); // 3
    

    清空数组

    arr.length = 0;
    // 或者
    arr = [];
    

    检测数组

    该方法并不能准确检测数组,待改善
    Array.isArray(val);

    支持的浏览器:IE9+、 Firefox 4+、Safari 5+、 Opera 10.5+、Chrome

    if(Array.isArray(val);){
      //  执行操作
    }
    

    转换方法

    1、toLocaleString()
    调用数组每一项的toLocaleString方法,和toString方法返回值一样
    返回值:数组中每项以逗号分割的字符串

    var colors= ['red', 'green', 'blue'];
    console.log(colors.toLocaleString()); // red,green,blue
    

    2、toString()
    调用数组每一项的toString方法
    返回值:数组中每项以逗号分割的字符串

    var colors= ['red', 'green', 'blue'];
    console.log(colors.toString()); // red,green,blue
    

    3、valueOf()
    返回值:返回原数组

    var colors= ['red', 'green', 'blue'];
    console.log(colors.valueOf()); // red,green,blue
    

    4、join(param)
    参数:param:用作分隔符的字符串,默认值为,
    返回值:包含所有数组项的字符串

    var arr = [1,2,3,4,5];
    console.log(arr.join()); //1,2,3,4,5
    console.log(arr.join('==')); // 1==2==3==4==5
    

    如果数组中某一项是null或者undefined,那么该值在以上方法中返回结果以空字符串表示

    栈、队列方法

    1、push
    参数:可选,可接收任意类型、任意数量的参数
    将参数添加到数组末尾
    返回值:数组修改后的长度
    是否改变原数组:是

    var arr = [1,2,3,4,5];
    arr.push({name:12});
    
    push

    2、pop
    返回值:返回数组的最后一项
    是否改变原数组:是

    arr.pop(); // 5
    console.log(arr); // [1, 2, 3, 4]
    

    3、shift
    返回值:移除数组中第一项并返回该项
    是否改变原数组:是

    arr.shift(); // 5
    console.log(arr); // [ 2, 3, 4, 5]
    

    与pop相反
    4、 unshift
    参数:可选,可接收任意类型、任意数量的参数
    将参数添加到数组头部
    返回值:数组修改后的长度
    是否改变原数组:是
    与push相反

    重排序方法

    5、reverse
    参数:无
    返回值:返回翻转数组项顺序后的新数组
    是否改变原数组:是

    var arr = [1,2,3,4,5];
    arr.reverse(); //[5, 4, 3, 2, 1]
    

    6、sort
    参数:可选,排序函数
    返回值:返回排序后的新数组
    是否改变原数组:是
    sort 方法默认是升序排序,即最小的在最前面,最大的在最后面
    在调用此方法时会调用每项的toString方法,然后比较得到的字符串再进行确定如何排序
    这样就可能出现问题:

    var arr = [1,2,3,4,5,10];
    arr = arr.sort()
    console.log(arr); // [1, 10, 2, 3, 4, 5]
    

    这时就需要传入一个比较函数来确定排序顺序
    比较函数需要两个参数:
    如果a-b>0,a将排在b之后
    如果a-b=0,a,b按照原顺序排列
    如果a-b<0,a将排在b之前

    // 比较函数(适用于大多数数据类型)
    function compare(a, b) {
       // return a - b; // 只适用于数组项为数值的数组
       if (a < b) {
         return -1;
       } else if (a > b) {
         return 1;
      } else {
         return 0;
      }
    }
    var arr = [1, 2, 3, 4, 5, 10];
    arr = arr.sort(compare);
    console.log(arr); // [1, 2, 3, 4, 5, 10]
    
    var arr = ["a", "d", "b", "e", "c"];
    arr = arr.sort(compare);
    console.log(arr); // ["a", "b", "c", "d", "e"]
    

    操作方法

    7、concat
    参数:可选,可以是一个元素、一维数组、二维数组、对象等
    返回值:将参数添加到原数组末尾后返回改变后的数组
    是否改变原数组:否
    如果参数为空,则返回当前数组副本,即复制原数组
    如果参数不是数组,这些值只会简单添加到原数组末尾,例如:


    concat
    var arr = [1, 2, 3];
    console.log(arr.concat(4,[5,6,7],[[8,9],[10,11]])); //[1, 2, 3, 4, 5, 6, 7, Array(2), Array(2)]
    console.log(arr); //[1, 2, 3]
    

    所以,如果用concat合并多维数组元素时显然是不靠谱的(解决办法???自己重写函数)
    8、slice
    参数:可选,接受一或两个参数,即起始位置、结束位置
    返回值:根据参数返回截取原数组项得到的新数组
    是否改变原数组:否
    如果参数为空,返回原数组的副本
    如果一个参数,返回从起始位置到原数组末尾所有项组成的新数组
    如果两个参数,返回从起始位置到结束位置(不包括结束位置)所有项组成的新数组
    如果起始位置大于结束位置,返回空数组

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    console.log(arr.slice()); // [1, 2, 3, 4, 5, 6, 7, 8, 9];
    console.log(arr.slice(0)); // [1, 2, 3, 4, 5, 6, 7, 8, 9];
    console.log(arr.slice(2)); // [3, 4, 5, 6, 7, 8, 9];
    console.log(arr.slice(2, 5)); // [3, 4, 5];
    

    如果参数为负值,则用数组长度与该值相加确定相应位置:

    console.log(arr.slice(-5,-1)); // 相当于 arr.slice(4, 8) 返回 [5, 6, 7, 8]
    

    9、splice
    参数:可选,接受1~n个参数,即起始位置、结束位置、要删除的项数和要插入的任意数量的项
    返回值:根据参数返回截取原数组项得到的新数组
    是否改变原数组:是

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    

    (1)如果不传入任何参数,返回空数组
    (2)删除:
    如果传入两个参数,即:要删除第一项的位置和要删除的项数

    console.log(arr.splice(2,3)); // [3, 4, 5]
    

    如果第一个参数为负值,则用原数组项数加上该值确定位置
    如果相加后还为负值,则从0位置开始取
    如果第二个参数为负值,返回空数组

    console.log(arr.splice(-4,2)); // [6, 7]
    console.log(arr.splice(-14,2)); // [1, 2]
    console.log(arr.splice(-4,-2)); // []
    

    (3)插入:
    参数:起始位置、0(要删除的项)、要插入的项(可以是多个)

    console.log(arr.splice(-4, 0, "ss", 'dd')); // []
    console.log(arr); // [0, 1, 2, 3, 4, 5, "ss", "dd", 6, 7, 8, 9]
    

    (4)替换
    参数:起始位置、要删除的项、要插入的项(可以是多个)

    console.log(arr.splice(4,2,'ss')); // [4, 5]
    console.log(arr); //  [0, 1, 2, 3, "ss", 6, 7, 8, 9]
    

    位置方法

    10、indexOf
    参数:要查找的项和(可选)查找起始位置索引
    返回值:如果在原数组中找到了该项,返回该项在数组中的位置索引;如果没有找到,返回 -1
    是否改变原数组:否

    console.log(arr.indexOf(2)); // 2
    

    11、lastIndexOf
    参数:要查找的项和(可选)查找起始位置索引
    返回值:如果在原数组中找到了该项,返回该项在数组中的位置索引;如果没有找到,返回 -1
    是否改变原数组:否
    使用方法和indexOf类似,只是从数组末尾向前查找

    迭代方法

    迭代方法的参数都是函数(三个参数,数组某项、索引、原数组)
    都不会影响原数组

    支持的浏览器:IE9+、 Firefox 2+、Safari 3+、 Opera 9.5+、Chrome

    12、every
    参数:
    返回值:遍历数组每一项,如果每一项都返回true,则返回true
    是否改变原数组:否

    var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var result = arr.every((item, index, array)=>{
      return item>=0;
    })
    console.log(result); //  true
    

    13、filter
    参数:
    返回值:遍历数组每一项,返回符合函数的值组成的数组
    是否改变原数组:否

    var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var result = arr.filter((item, index, array)=>{
      return item>5;
    })
    console.log(result); //  [6, 7, 8, 9]
    

    14、forEach
    对数组每一项运行传入的函数,本质上和for循环迭代数组一样
    返回值:没有返回值
    是否改变原数组:否

    arr.forEach((item, index, array)=>{
    // 执行操作
    })
    

    15、map
    参数:
    返回值:返回每一项运行传入函数的运行结果组成的数组
    是否改变原数组:否

    var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var result = arr.filter((item, index, array)=>{
      return item * 2;
    })
    console.log(result); // [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
    

    16、some
    参数:
    返回值:只要有一个符合传入函数,则返回true
    是否改变原数组:否
    和every相反

    var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var result = arr.some((item, index, array)=>{
      return item > 2;
    })
    console.log(result); // true
    

    归并方法

    支持的浏览器:IE9+、 Firefox 3+、Safari 4+、 Opera 10.5+、Chrome

    17、reduce
    参数:两个参数:第一个是在每一项上调用的函数,第二个是(可选)作为归并基础的初始值
    传入函数的参数:上一个值、当前值、索引、原数组
    返回值:从第一项开始迭代数组所有项,构建最终返回的值
    是否改变原数组:否

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    var result = arr.reduce((prev, cur, index, array) => {
      return prev + cur;
    });
    console.log(arr, result); //[1, 2, 3, 4, 5, 6, 7, 8, 9] 45
    

    18、reduceRight
    参数:两个参数:第一个是在每一项上调用的函数,第二个是(可选)作为归并基础的初始值
    返回值:从最后一项开始迭代数组所有项,构建最终返回的值
    是否改变原数组:否
    用法和reduce类似

    ES6扩充

    1、扩展运算符(spread)
    格式:...
    将数组转成逗号分割的参数序列
    该运算符主要用于函数调用
    2、Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
    3、Array.of方法用于将一组值,转换为数组
    弥补new Array的缺陷

    
    

    相关文章

      网友评论

          本文标题:2、Array

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