《JavaScript 数组方法全解:彻底征服数组操作》

45 阅读6分钟

在 JavaScript 的广阔世界中,数组是你不可或缺的得力助手。无论你是初学者还是经验丰富的开发者,掌握数组方法都能让你的代码如行云流水般优雅和高效。今天,我们将带你飞跃数组的神秘世界,一步步揭开那些神奇方法的面纱,助你在面试中轻松脱颖而出!

一、数组创建 📦

  1. 使用数组字面量表示法

    let arr1 = []; // 创建一个空数组
    let arr2 = [20]; // 创建一个包含1项数据为20的数组
    let arr3 = ["lily", "lucy", "Tom"]; // 创建一个包含3个字符串的数组
    
  2. 使用 Array 构造函数

    • 无参数构造

      let arr = new Array(); // 创建一个空数组
      
    • 带参数构造

      • 传入一个数值参数时,创建一个指定长度的空数组

        let arr = new Array(20); // 创建一个包含20项的空数组
        
      • 传入多个参数时,创建一个包含指定元素的数组

        let arr = new Array("lily", "lucy", "Tom"); // 创建一个包含3个字符串的数组 
        
  3. Array.of 方法(ES6)

    Array.of() 创建一个包含所有传入参数的数组,不管参数的数量和类型。

    let arr = Array.of(1, 2);
    console.log(arr.length); // 2
    
    let arr1 = Array.of(3);
    console.log(arr1.length); // 1
    console.log(arr1[0]); // 3
    
    let arr2 = Array.of('2');
    console.log(arr2.length); // 1
    console.log(arr2[0]); // '2'
    
  4. Array.from 方法(ES6)

    将可迭代对象或类数组对象转换为数组。

    function arga(...args) {
        let arg = Array.from(args);
        console.log(arg);
    }
    
    arga('arr1', 26, 'from'); // ['arr1', 26, 'from']
    
    // 使用映射函数转换数组
    function arga(...args) {
        return Array.from(args, value => value + 1);
    }
    
    let arr = arga('arr', 26, 'pop');
    console.log(arr); // ['arr1', 27, 'pop1']
    
    // 使用指定的 `this` 值
    const helper = {
      diff: 1,
      add(value) {
        return value + this.diff;
      }
    }
    
    function translate() {
        return Array.from(arguments, helper.add, helper); 
    }
    
    let arr = translate('liu', 26, 'man');
    console.log(arr); // ["liu1", 27, "man1"]
    

二、数组方法 🔧

  1. join()

    将数组的所有元素连接成一个字符串,元素间用指定的分隔符分隔。

    let arr = [1, 2, 3];
    console.log(arr.join()); // 1,2,3
    console.log(arr.join("-")); // 1-2-3
    
  2. push()pop()

    • push() :向数组末尾添加一个或多个元素。

      let arr = ["Lily", "lucy", "Tom"];
      let count = arr.push("Jack", "Sean");
      console.log(count); // 5
      console.log(arr); // ["Lily", "lucy", "Tom", "Jack", "Sean"]
      
    • pop() :删除数组的最后一个元素并返回该元素。

      javascript
      Copy code
      let item = arr.pop();
      console.log(item); // Sean
      console.log(arr); // ["Lily", "lucy", "Tom", "Jack"]
      
  3. shift()unshift()

    • shift() :删除数组的第一个元素并返回该元素。

      let item = arr.shift();
      console.log(item); // Jack
      console.log(arr); // ["lucy", "Tom", "Jack"]
      
    • unshift() :在数组开头添加一个或多个元素,并返回新数组的长度。

      let count = arr.unshift("Jack", "Sean");
      console.log(count); // 5
      console.log(arr); // ["Jack", "Sean", "lucy", "Tom"]
      
  4. sort()

    对数组的元素进行排序,默认按字母升序。

    let arr = ["a", "d", "c", "b"];
    console.log(arr.sort()); // ["a", "b", "c", "d"]
    
    let arr2 = [13, 24, 51, 3];
    console.log(arr2.sort((a, b) => a - b)); // [3, 13, 24, 51]
    
  5. reverse()

    颠倒数组中元素的顺序。

    let arr = [13, 24, 51, 3];
    console.log(arr.reverse()); // [3, 51, 24, 13]
    
  6. concat()

    连接两个或多个数组,返回新数组,不修改原数组。

    let arr = [1, 3, 5, 7];
    let arrCopy = arr.concat(9, [11, 13]);
    console.log(arrCopy); // [1, 3, 5, 7, 9, 11, 13]
    
  7. slice()

    返回数组的一部分,创建一个新数组,不修改原数组。

    let arr = [1, 3, 5, 7, 9, 11];
    console.log(arr.slice(1)); // [3, 5, 7, 9, 11]
    console.log(arr.slice(1, 4)); // [3, 5, 7]
    
  8. splice()

    用于删除、替换或插入数组中的元素。

    let arr = [1, 3, 5, 7, 9, 11];
    let removed = arr.splice(0, 2);
    console.log(arr); // [5, 7, 9, 11]
    console.log(removed); // [1, 3]
    
    arr.splice(2, 0, 4, 6);
    console.log(arr); // [5, 7, 4, 6, 9, 11]
    
  9. indexOf()lastIndexOf()

    • indexOf() :返回第一个匹配项的索引,从头开始查找。

      let arr = [1, 3, 5, 7, 7, 5, 3, 1];
      console.log(arr.indexOf(5)); // 2
      
    • lastIndexOf() :返回最后一个匹配项的索引,从尾部开始查找。

      console.log(arr.lastIndexOf(5)); // 5
      
  10. forEach()

    遍历数组中的每一项,执行给定的函数。

    let arr = [11, 22, 33, 44, 55];
    arr.forEach(function(x, index, a) {
        console.log(x + '|' + index + '|' + (a === arr));
    });
    
  11. map()

    返回一个新数组,数组中的元素为原数组元素调用函数处理后的值。

    let arr = [1, 2, 3, 4, 5];
    let arr2 = arr.map(item => item * item);
    console.log(arr2); // [1, 4, 9, 16, 25]
    
  12. filter()

    返回一个新数组,包含所有满足条件的元素。

    let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    let arr2 = arr.filter(x => x % 3 === 0 || x >= 8);
    console.log(arr2); // [3, 6, 9, 8, 10]
    
  13. fill()

    使用指定值填充数组中的一个或多个元素。

    let arr = [1, 2, 3, 'cc', 5];
    arr.fill(1);
    console.log(arr); // [1, 1, 1, 1, 1]
    
  14. every()

    判断数组中每一项是否满足条件,只有所有项都满足条件才返回 true

    let arr = [1, 2, 3, 4, 5];
    console.log(arr.every(x => x < 6)); // true
    
  15. some()

    判断数组中是否有至少一个元素满足条件,满足则返回 true

    let arr = [1, 2, 3, 4, 5];
    console.log(arr.some(x => x > 4)); // true
    
  16. reduce()reduceRight()

    • reduce() :对数组中的每一项调用指定的函数,累加结果,返回最终的计算值。

      let arr = [1, 2, 3, 4];
      let sum = arr.reduce((total, value) => total + value, 0);
      console.log(sum); // 10
      
    • reduceRight() :从数组的末尾开始进行累加计算。

      let arr = [1, 2, 3, 4];
      let sum = arr.reduceRight((total, value) => total + value, 0);
      console.log(sum); // 10
      
  17. find()findIndex()

    • find() :返回第一个满足测试条件的数组元素,找不到返回 undefined

      let arr = [1, 2, 3, 4, 5];
      console.log(arr.find(x => x > 3)); // 4
      
    • findIndex() :返回第一个满足测试条件的元素的索引,找不到返回 -1

      console.log(arr.findIndex(x => x > 3)); // 3
      
  18. flat()flatMap()

    • flat() :将嵌套的数组“拍平”,指定拍平的深度。

      let arr = [1, [2, [3, [4]]]];
      console.log(arr.flat(2)); // [1, 2, 3, [4]]
      
    • flatMap() :先调用 map(),然后对结果使用 flat(),默认深度为 1。

      let arr = [1, 2, 3, 4];
      let result = arr.flatMap(x => [x, x * 2]);
      console.log(result); // [1, 2, 2, 4, 3, 6, 4, 8]
      
  19. includes()

    判断数组中是否包含某个指定值,返回 truefalse

    let arr = [1, 2, 3, 4, 5];
    console.log(arr.includes(3)); // true
    console.log(arr.includes(6)); // false
    
  20. copyWithin()

    将数组的部分元素复制到同一数组的另一位置,并返回该数组。

    let arr = [1, 2, 3, 4, 5];
    console.log(arr.copyWithin(0, 3, 5)); // [4, 5, 3, 4, 5]
    
  21. from()

    从类数组或可迭代对象创建一个新数组实例。

    let arr = Array.from('hello');
    console.log(arr); // ['h', 'e', 'l', 'l', 'o']
    
  22. toString()toLocaleString()

    • toString() :将数组转换为字符串。

      let arr = [1, 2, 3];
      console.log(arr.toString()); // "1,2,3"
      
    • toLocaleString() :将数组转换为本地化的字符串。

      console.log(arr.toLocaleString()); // "1,2,3" (取决于环境)
      
  23. keys(), values(), entries()

    • keys() :返回数组的键值迭代器。

      let arr = ["a", "b", "c"];
      for (let key of arr.keys()) {
        console.log(key); // 0, 1, 2
      }
      
    • values() :返回数组的值迭代器。

      for (let value of arr.values()) {
        console.log(value); // "a", "b", "c"
      }
      
    • entries() :返回数组的键值对迭代器。

      for (let [index, value] of arr.entries()) {
        console.log(index, value); // 0 "a", 1 "b", 2 "c"
      }
      

数组方法的异同点比较 🆚

  • push() vs unshift() : push() 向数组末尾添加元素,而 unshift() 向数组开头添加元素。
  • pop() vs shift() : pop() 从数组末尾删除元素,而 shift() 从数组开头删除元素。
  • slice() vs splice() : slice() 返回数组的一部分,原数组不变;splice() 修改原数组并返回删除的元素。
  • map() vs forEach() : map() 返回一个新数组,forEach() 不返回任何东西。
  • find() vs filter() : find() 返回第一个匹配的元素,filter() 返回所有匹配的元素组成的新数组。
  • reduce() vs reduceRight() : reduce() 从数组的左边开始处理,reduceRight() 从右边开始处理。

希望这些信息能帮助你更好地理解和使用 JavaScript 数组的创建与操作方法! 🌟