美文网首页
[JavaScript]数据结构与算法——数组基础知识

[JavaScript]数据结构与算法——数组基础知识

作者: Jingan | 来源:发表于2018-11-25 18:54 被阅读0次

    一、数组简介

    在之前所接触的编程语言中,如C、C++、Java等对于数组的定义是这样的:数组存储一系列同一种数据类型的值。但是在JavaScript中,我们也可以在数组中保存不同类型的值。虽然语法上能够支持我们这样做,但我们应该遵守最佳实践,避免这样做。

    二、创建和初始化数组

    let color = new Array(); // 创建一个数组,length = 0
    let color = new Array(3); // 创建一个数组, length = 0
    let color = new Array('red', 'green', 'black'); // 创建一个数组,并初始化三个元素,length = 3;
    let color = []; // 创建一个数组,同第一种方式
    let color = ['red', 'green', 'black']; // 创建一个数组,同第三种方式
    

    如果我们在创建数组时,要求创建指定长度的数组,则只能使用new方式。

    如何获取数组的长度?

    let color = new Array('red', 'green', 'black');
    console.log(color.length); // 3
    

    如何判断一个变量是Array类型?

    1. 方法一:从原型入手,使用Array.prototype.isPrototypeOf(obj)来判断Array是否在obj的原型链中;
    const isArray = Array.prototype.isPrototypeOf(color);
    console.log(isArray);  // true
    
    1. 方法二:从构造函数入手,使用obj instanceof Array;
    const isArray = color instanceof Array;
    console.log(isArray); // true
    
    1. 方法三:js提供了一个方法专门来判断是否是数组,Array.isArray(obj);
    const isArray = Array.isArray(color);
    console.log(isArray);
    
    1. 方法四:根据对象的class属性(类属性),跨原型链调用toString()方法, Object.prototype.toString.call(obj),MDN推荐使用这种方式;
    const isArray = Object.prototype.toString.call(color);
    console.log(isArray); // "[object Array]"
    
    // 封装成一个函数
    function getClass(object) {
      return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
    }
    
    console.log(getClass(color)); // "Array"
    

    或者这样写:

    function getClass(object) {
      if (object === null) return "null";
      if (object === undefined) return "undefined";
      return Object.prototype.toString.call(object).slice(8, -1); 
    }
    

    三、数组的常见方法

    3.1 添加元素

    1. 使用length属性
      如果想要给数组末尾添加一个元素,可以利用length属性在数组的最后一个空位上增添元素;
    let color = new Array('red', 'green', 'black');
    color[color.length] = 'yellow'; // color.length = 3
    console.log(color); // ["red", "green", "black", "yellow"]
    
    1. push()方法
      该方法可以把元素添加到数组的末尾,可以添加任意数量的元素,返回值为更改后数组的长度;
    color.push('yellow', 'blue');
    console.log(color); // ["red", "green", "black", "yellow", "blue"]
    
    1. unshift()方法
      该方法可以将元素添加到数组的头部,可以添加任意数量的元素,返回值为更改后数组的长度;
    color.unshift('yellow', 'blue');
    console.log(color); // ["yellow", "blue", "red", "green", "black"]
    

    利用for循环实现unshift()方法的效果,但是只能在头部添加一个元素,基本思路是通过遍历,将数组的每一个元素后移一位;

    for (let i = color.length; i >= 0; i--) {
      color[i] = color[i - 1];
    }
    color[0] = '1';
    console.log(color); // ["1", "red", "green", "black"]
    

    3.2 删除元素

    1. pop()
      删除数组里面最后一项,返回值为被删除的元素;
    let color = new Array('red', 'green', 'black');
    const item = color.pop();
    console.log(item); // "black"
    console.log(color); // ["red", "green"]
    
    1. shift()
      删除数组的第一项,返回值为被删除的元素;
    let color = new Array('red', 'green', 'black');
    const item = color.shift();
    console.log(item); // "red"
    console.log(color); // ["green", "black"]
    

    3.3 在任意位置添加或删除元素

    1. splice()
      使用splice()方法可以通过指定索引,就可以删除相应位置和数量的元素,返回值是被删除的元素列表;
    let week = ['周一', '周二', '周三', '周四', '周五', '周六', '周天'];
    const items = week.splice(2, 2);
    console.log(items); // ["周三", "周四"]
    console.log(week); // ["周一", "周二", "周五", "周六", "周天"]
    

    同样,splice还可以插入元素:

    let week = ['周一', '周二', '周三', '周四', '周五', '周六', '周天'];
    const items = week.splice(2, 2, 1, 2, 3);
    console.log(items); // ["周三", "周四"]
    console.log(week); // ["周一", "周二", "周五", "周六", "周天"]
    

    该例子是从index=2的位置上,删除了后面接连着的两个元素,并在此位置上增添了“1,2,3”这三个元素。

    四、数组的遍历方法

    1. forEach()
    const arr = ['red', 'yellow', 'green'];
    arr.forEach((element, index) => {
      console.log(index + ': ' + element);
    }); 
    // "0: red"
    // "1: yellow"
    // "2: green"
    
    1. filter()
      array.filter(callback,[thisObject]),callback参数是要对每个数组元素执行的回调函数;thisObject是在执行回调函数时定义的this对象。
      该方法的作用是:对数组中的每个元素都执行一次指定的函数(callback),并且创建一个新的数组,该数组元素是所有回调函数执行时返回值为 true 的原数组元素。它只对数组中的非空元素执行指定的函数,没有赋值或者已经删除的元素将被忽略,同时,新创建的数组也不会包含这些元素,该方法不会改变原数组。
    const numbers = [];
    for(let i = 1; i <= 10; i++ ) {
      numbers.push(i);
    }
    // 过滤掉数组中的奇数
    const isEven = num => {
      return num % 2 !== 0;
    }
    const result = numbers.filter(isEven);
    console.log(result); // [1, 3, 5, 7, 9]
    
    1. map()
    const words = ['a', 'b', 'c'];
    // 将数组中的元素改为大写
    const toUpperCase = item => {
      return item.toUpperCase();
    };
    const result = words.map(toUpperCase);
    console.log(result);  // ["A", "B", "C"]
    console.log(words); // ["a", "b", "c"] 原数组不变
    
    1. some()
      对数组中的每个元素都执行一次回调函数(callback),直到此函数返回 true,如果发现这个元素,some 将返回 true,如果回调函数对每个元素执行后都返回 false ,some 将返回 false。它只对数组中的非空元素执行指定的函数,没有赋值或者已经删除的元素将被忽略。
    // 判断数组中是否存在大于10的数字
    const isBiggerThan10 = item => {
      return item > 10;
    };
    const arr1 = [1, 2, 4];
    const arr2 = [1, 23, 4];
    console.log(arr1.some(isBiggerThan10)); // false
    console.log(arr2.some(isBiggerThan10)); // true
    
    1. every()
      方法为数组中的每个元素执行一次 callback 函数,直到它找到一个使 callback 返回 false(表示可转换为布尔值 false 的值)的元素。如果发现了一个这样的元素,every 方法将会立即返回 false。否则,callback 为每一个元素返回 true,every 就会返回 true。callback 只会为那些已经被赋值的索引调用。不会为那些被删除或从来没被赋值的索引调用。
    // 判断数组中是否所有的元素都大于10
    const isBiggerThan10 = item => {
      return item > 10;
    };
    const arr1 = [1, 2, 23];
    const arr2 = [11, 23, 14];
    console.log(arr1.every(isBiggerThan10)); // false
    console.log(arr2.every(isBiggerThan10)); // true
    
    1. indexOf()
      正向搜索,比较 searchElement 和数组的每个元素是否绝对一致(===),当有元素符合条件时,返回当前元素的索引;如果没有发现,就直接返回 -1 ;
    const arr = [1, 2, 'cat'];
    console.log(arr.indexOf(2));
    console.log(arr.indexOf('2'));
    
    1. lastIndexOf()
      同indexOf,只不过是逆向搜索;

    五、数组的其他方法

    1. 数组合并——concat()
      若我们有多个数组,我们需要将他们合并成一个数组,常规下我们可以迭代各个数组,然后把其中每个元素都添加到最终的数组中。但是js中已经提供了concat()方法。
    let name = 'guojingan';
    let arr1 = ['male', 'suining'];
    let arr2 = ['dog', 'cat', 'pets'];
    
    let total = arr1.concat(name, arr2);
    console.log(total); // ["male", "suining", "guojingan", "dog", "cat", "pets"]
    
    1. slice()
      该方法可从已有的数组中返回选定的元素,slice(start, end),第二个参数可选,返回一个新数组。
    const arr = ['a', 'b', 'c', 'd'];
    const arr2 = arr.slice(1, 2);
    console.log(arr2); // ["b"]
    

    相关文章

      网友评论

          本文标题:[JavaScript]数据结构与算法——数组基础知识

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