数组

242 阅读6分钟

数组的特性

  • 索引(数组属性名)
  • 从0开始排列 数组中每一项都有对应的索引值
  • 便于我们通过索引 来获取数组中每一项
  • 获取数组中的索引为2的 那一项的值
    //数组[索引值]
    console.log(arr[2]);
    // length 代表数组的长度 当前数组中元素的个数
    console.log(arr.length);
  • 元素集合 也称为类数组 但不是数组
     var titles = document.getElementsByTagName('h3');
     console.log(titles);

     function add() {
       console.log(arguments); // 实参集合 也称为类数组 但不是数组
     }
     add(1, 2, 3, 4);

    // 获取数组中的最后一项
    console.log(arr[3]);
    console.log(arr[arr.length - 1]); 
  • 数组方法
  • 数组中的方法 都存储这Array.prototype
    • Array.prototype

数组增加和删除

  • push
    • 作用:向数组末尾添加一项或多项
    • 返回值:添加后的数组长度
    • 原数组:发生改变
    var arr = [1, 2, 3];
    console.log('添加前的数组', arr); // [1, 2, 3]
    var result = arr.push(10, 20);
    console.log('添加后的数组', arr); // [1, 2, 3, 10, 20]
    console.log('return', result);
  • unshift
    • 作用:向数组开头添加一项或者多项
    • 返回值:添加后的数组长度
    • 原数组:发生改变
    var arr = [1, 2, 3];
    console.log('添加前', arr); // [1, 2, 3]
    var result = arr.unshift(40, 50, 60);
    console.log('添加后', arr); // [40, 50, 60, 1, 2, 3]
    console.log('返回值', result); // 6
  • pop
    • 作用:删除数组末尾最后一项
    • 原数组:发生改变
    • 返回值:返回的是 删除的那一项
    var arr = [1, 2, 3, 'hello'];
    console.log('删除前', arr); // [1, 2, 3, 'hello']
    var result = arr.pop();
    console.log('删除后', arr); // [1, 2, 3]
    console.log('返回值', result); // 'hello'
  • shift
    • 作用:删除数组开头第一项
    • 原数组:发生改变
    • 返回值:删除的那一项
    var arr = ['hello', 1, 2, 3];
    console.log('删除前', arr); // ['hello', 1, 2, 3]
    var result = arr.shift();
    console.log('删除后', arr); // [1, 2, 3]
    console.log('返回值', result); // 'hello'

数组查找

  • indexOf
    • 查找某个值 在数组中的索引位置
    • 返回值 查找到的那一项的索引
    var arr = [1, 'a', 2, 'b', 3, 'c'];
    var res = arr.indexOf('b'); // 3
    //如果查找不到 就返回-1 说明数组中不存在这一项
    var res = arr.indexOf(20); // -1
    console.log('返回值', res);
  • lastIndexOf
    • 查找 值在数组中 最后一次出现的索引位置
    var arr = [1, 'b', 2, 'b', 3];
    
    // 找到的是 最前面'b'
    console.log(arr.indexOf('b')); // 1
    
    // 找到的是 最后面'b'
    console.log(arr.lastIndexOf('b')); // 3
    
    var arr2 = [1, 'b', 20, 3];
    
    console.log(arr2.indexOf('b')); // 1
    
    console.log(arr2.lastIndexOf('b')); // 1
    
    // 查找一个值 是否存在于这个数组中 'l'
    // var res = arr2.indexOf('l');
    
    var res = arr2.indexOf(20);
    
    if (res === -1) {
      console.log('当前数组中 不存在这个字符')
    } else {
      console.log(`这个值的索引位置: ${res}`)
    }

splice

  • splice
    • 操作的都是原数组 原数组发生改变
    • 返回值 都是一个新数组
  • 情况一 参数1
    • splice(x)
    • 从索引x处开始 一直删除到末尾,将删除的内容组成新数组返回
    var arr = [10, 20, 30, 40, 50];

    console.log('调用前', arr); // [10, 20, 30, 40, 50]
    
    var result = arr.splice(2);

    console.log('调用后', arr); // [10, 20]
    console.log('返回值', result); // [30, 40, 50]
  • 情况二 两个参数
    • splice(x, y)
    • 从索引x处开始,删除y个 将删除的内容组成新数组返回
    var arr = [10, 20, 30, 40, 50];

     console.log('调用前', arr);

    var result = arr.splice(1, 3);

    console.log('调用后', arr); // [10, 50]

    console.log('返回值', result); // [20, 30, 40]
  • 情况三 三个 及 三个以上参数
    • splice(x, y, ...n)
    • 从索引x处开始,删除y个 将参数n及后面所有参数 插入到索引x处
    • 将删除的内容组成新数组返回
    var arr = [10, 20, 30, 40, 50];
    
    console.log('调用前', arr); // [10, 20, 30, 40, 50]

    var result = arr.splice(1, 3, 100, 200, 300);

    console.log('调用后', arr); // [10, 100, 200, 300, 50]

    console.log('返回值', result); // [20, 30, 40]
  • 添加 第二个参数为0
    • splice(x, 0, ...n)
    • 将参数n以及后面所有参数 插入到索引x处
    var arr = [10, 20, 30, 40, 50];

    console.log('调用前', arr); // [10, 20, 30, 40, 50]

    var result = arr.splice(1, 0, 2019, 2018);

    console.log('调用后', arr); // [10, 2019, 2018, 20, 30, 40, 50]

    console.log('返回值', result); // []


    var ary = [1, 2, 3];

    ary.splice(1, 0, 'hello', 'world!'); // [1, "hello", "world!", 2, 3]
  • 向开头添加
    • unshift()
    • splice(0, 0, z)
    var ary = [10, 20];

    ary.splice(0, 0, 1000);
    console.log(ary);
  • 向末尾添加
    • push()
    • splice(arr.length, 0, z)
    var ary = [10, 20];

    ary.splice(ary.length, 0, 'last');

    console.log(ary);

数组截取

  • slice() 截取、克隆
    • 不会影响原数组
    • 返回值 新数组
  • 情况一 克隆
    • slice()/slice(0)/slice(null)
    • 按照原数组 完全克隆一份 组成新数组返回
    var arr = ['a', 'b', 'c', 'd'];

    console.log('原数组', arr);

    var res = arr.slice(null);

    console.log('返回值', res); // 克隆后的新数组

    console.log(res === arr); // false
  • 情况二 slice(x)
    • 从索引x处开始,截取到末尾,将截取到的内容 组成新数组返回
    var arr = ['a', 'b', 'c', 'd', 'e', 'f'];

    var res = arr.slice(2);

    console.log('返回值', res); // ['c', 'd', 'e', 'f']

    // slice(-x) 支持负数 相当于倒着截取x个值

    slice(-x) => slice(arr.length + (-x));
    var arr = ['a', 'b', 'c', 'd', 'e', 'f'];

    var res = arr.slice(-2); // 4

    console.log('返回值', res); // ['e', 'f']
  • 情况三
    • slice(x, y) 从索引x处开始,截取到索引y处(注意:不包含索引y 这一项)
    • x起始索引位置 y结束索引位置
    // 从第1个 截取到第3个
    var arr = ['a', 'b', 'c', 'd', 'e', 'f'];

    var res = arr.slice(0, 3);

    console.log('返回值', res); // ['b', 'c']
  • slice(-x, -y);
  • slice(ary.length - x, ary.length - y);
  • 如果起始索引 大于 结束索引 不会截取到任何内容 直接返回一个新的空数组

排序

  • 从小到大

  • 从大到小

  • sort()

    • 原数组会发生改变
    • 返回值:排序后的原数组
    var arr = [3, 4, 1, 2, 5]

    console.log('排序前', arr)

    var res = arr.sort()

    console.log('排序后', arr)

    console.log('返回值', res)

    console.log(res === arr) // true
    
    // 直接使用sort() 默认情况下 只能排序10以内的数字

    var arr = [3, 14, 1, 2, 5, 26, 100]
    
    arr.sort()

    console.log('排序后', arr) // [1, 100, 14, 2, 26, 3, 5]

    var arr = [3, 14, 1, 2, 5, 26, 100]

    // 从小到大排序

    arr.sort(function (a, b) {
    return a - b
    })

    // 从大到小排序

   arr.sort(function (a, b) {
    return b - a
   })
  console.log('排序后', arr)
   var arr = [3, 1, 'b', 'a']

  // arr.sort() 可以对字母排序
  console.log(arr) // [1, 3, "a", "b"]
  • 排列
    • 将原数组 倒着排列
    var arr = [1, 2, 3, 4]
    var arr = ['h', 'e', 'l', 'l', 'o']

    arr.reverse()

    console.log('reverse', arr) // ["o", "l", "l", "e", "h"]

数组拼接

  • concat() 拼接
    • 不会影响原数组
    • 返回值:拼接好的内容 组成的新数组
    var arr1 = [1, 2, 3];
    var arr2 = [6, 7, 8];

    var res1 = arr1.concat(arr2, 2, 'df'); 

    console.log('返回值', res1); // [1, 2, 3, 6, 7, 8, 2, 'df']
    
    var res2 = arr2.concat(arr1);

    console.log('返回值', res2); // [6, 7, 8, 1, 2, 3]

    console.log('arr1', arr1);
    console.log('arr2', arr2);
    var arr = [1];

    var res = arr.concat([100], 300, 'hello');
    console.log(res); // [1, 100, 300, "hello"]

    // concat() 拼接时 只能展开一层数组
    var res = arr.concat([[100]], [300]);

    console.log(res); // [1, [100], 300]

数组转换成字符串

  • 将数组转换成字符串 原数组不会发生改变
    • toString()
    • join()
    // toString()

    var arr = [1, 2, 3];

    var res = arr.toString();

    console.log('返回值', res); // "1,2,3"
  • join(连接符)
    • 根据指定的连接符 组成新字符串
    var arr = [1, 2, 3];

    arr.join(); // "1,2,3" 相当于toString()

    arr.join(''); // "123"

    arr.join('+'); // "1+2+3"
    arr.join('*'); // "1*2*3"
  • eval() 将字符串 当做JS代码(表达式)来执行
    • 相当于小型JS解释器
    eval("1+2+3"); // 6
    eval("1*2*3"); // 6

    // 对数组中每一项 进行求和
    var a = [10, 20, 100, 30, 100];

    var total = eval(a.join('+')); // eval("10+20+100+30+100")
    console.log(total); // 260

    console.log(eval(a.join('*'))); // 60000000

    // 相当于声明了一个变量
    eval('var num = 1000');
    console.log(num);