最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 一文详解JavaScript中的数组

    正文概述 掘金(Yuki啊星)   2020-11-30   459

    一文详解JavaScript中的数组

    前言

    最近在重学JS基础,然后正好学到数组这,前期是通过看视频学习的,后来发现通过看视频学习进度实在是太慢了,所以又开始看书看文档学,然后就开始看“红宝书”(JavaScript高级程序设计)学习,看的最新的第四版的,数组这部分前期看视频学了一部分,后面又看书学了,前前后后学了有大概5天,当然是下班时间学习,学完了想写个全面的总结,然后就有了这篇文章,希望大佬们看了发现什么错误能在评论区指出,我会立马改正的。

    1.数组介绍

    (1)什么是数组?

    数组是使用单独的变量名来存储一系列的值的一个对象。

    (2)怎么创建数组?

    创建数组有两种方式

    1. 对象方式创建数组
    2. 字面量方式创建数组

    创建数组可以通过上面这两种方式,当然也可以通过Array.of()这个函数创建数组。

    对象方式创建数组

    let array = new Array();
    

    Tips:

    let array = Array();
    

    这种方式创建数组,对象也可以通过这两种方式创建,那么这种方式与上面那种方式有什么区别呢,这两种方式创建数组的区别就是内部this指向不同,一个指向调用者,一个指向全局的window对象。

    console.log(new Array(1)); // [empty]
    console.log(new Array(1,2,3)); //  [1, 2, 3]
    console.log(Array.of(1)); // [1]
    console.log(Array.of(1,2,3)); // [1, 2, 3]
    

    Tips:

    字面量的方式创建数组

    let arr = [];
    

    这种方式创建数组非常的简单便捷,所以推荐使用这种方法创建数组

    Tips:

    2.Array对象介绍

    (1)Array介绍

    上面我们也用了一个Array的方法,就是Array.of(),那么Array跟数组到底是什么关系呢,根据MDN上的定义:

    JavaScript的 Array 对象是用于构造数组的全局对象,数组是类似于列表的高阶对象。

    换句话说就是:

    Array对象是js内置的用于构造数组的全局对象,数组身上的方法都是继承于Array对象。

    我们来打印看下这个Array对象的结构:

    一文详解JavaScript中的数组

    我们从这个打印结果可以看出Array下面主要有三个 私有 方法:

    方法名称方法介绍JavaScript 版本是否会改变原数组实例
    from()将类数组结构转换为数组实例ES6×isArray()判断数组是否为数组类型ES6×of()将一组参数转换为数组实例ES6×

    (2)Array.from()

    参数描述
    object必需,要转换为数组的对象mapFunction可选,数组中每个元素要调用的函数thisValue可选,映射函数(mapFunction)中的 this 对象
    返回值
    新的数组实例
    //  1.类数组对象
    let obj = {
        1: 'techerM',
        2: 15,
        length: 2
    };
    console.log(Array.from(obj)); // ["techerM", 15]
    // 2.字符串
    let str = '阿星';
    console.log(Array.from(str)); // ["阿", "星"]
    // 3.集合
    let s = new Set().add(1)
                     .add(2)
                     .add(1)
                     .add(4);
    console.log(Array.from(s)); // [1, 2, 4]
    // 4.第二个参数,可操作数组中的每个元素
    let numbersObj = {
        0:1,
        1:2,
        2:3,
        3:2,
        length: 3
    };
    console.log(Array.from(numbersObj,item => item*3));//[3, 6, 9]
    console.log(numbersObj); // {0: 1, 1: 2, 2: 3, 3: 2, length: 3}
    // 5.第三个参数,指定第二个参数(函数)中this的指向
    let numArray = [1,2,3];
    var name = '小花';
    let res1 = Array.from(numArray,function(item){
        return this.name;
    })
    let res2 = Array.from(numArray,function(item){
        return this.name;
    },{name:'小丽'})
    console.log(res1); // ["小花", "小花", "小花"]
    console.log(res2); // ["小丽", "小丽", "小丽"]
    

    Tips:

    let obj = {
        name: '小丽',
        value: 100,
        length: 2
    }
    

    Array.from()方法用于哪些地方

    1. 将字符串转换为数组
    2. 将集合和映射转换为数组
    3. 可以对现有数组进行浅复制
    4. 可应用于任何符合条件(length和索引)的可迭代对象

    (3)Array.of()

    参数描述
    elementN任意个参数,将按顺序成为返回数组中的元素。
    返回值
    新的数组实例
    // 一组参数
    console.log(Array.of(1,2,3)); //  [1, 2, 3]
    // 通过 Array.of() 创建数组对象
    let arr = Array.of(1);
    console.log(arr); // [1]
    // new Array() 创建数组对象
    let arr1 = new Array(1);
    console.log(arr1); // [empty]
    

    Tips:

    (4)Array.isArray()

    参数描述
    obj必需,要判断的对象。
    返回值
    布尔值,如果对象是数组返回 true,否则返回 false。
    let colors = ['red','green'];
    let name = '小王';
    let age = 18;
    console.log(Array.isArray(colors)); // true
    console.log(Array.isArray(name)); // false
    console.log(Array.isArray(age)); // false
    

    3.检测数组

    一般我们在js中检测数据类型通常用 typeof 关键字,但是 typeof 并不能分开对象与数组,检测数组时返回的也是 object,所以我们就需要用其它的办法来区分对象数组了。

    方法描述
    Array.isArray()返回一个布尔类型的值,是数组则返回true,反之falseinstanceof返回一个布尔类型的值,是数组则返回true,反之falseObject.prototype.toString.call()返回详细的具体类型
    let array = [1,2];
    let obj = {name: '小明'};
    console.log(Array.isArray(array)); // true
    console.log(Array.isArray(obj)); // false
    console.log(array instanceof Array); // true
    console.log(obj instanceof Array); // false
    console.log(Object.prototype.toString.call(array)); // [object Array]
    console.log(Object.prototype.toString.call(obj)); // [object Object]
    

    上面这个三个方法都可以用来区分对象数组,平常我们使用还是最好使用 Array.isArray() 这个方法。

    Tips:

    4.数组中的方法

    数组中的方法总览

    首先我们从控制台打印看一下数组:

    console.log([]);
    

    一文详解JavaScript中的数组

    方法描述是否改变原数组实例
    push()向数组的末尾添加一个或多个元素,并返回新的长度pop()删除并返回数组的最后一个元素unshift()向数组的开头添加一个或更多元素,并返回新的长度shift()把数组的第一个元素从其中删除,并返回第一个元素的值copyWithin()浅复制数组的一部分到同一数组中的另一个位置,并返回它,不会改变原数组的长度fill()向一个已有的数组中插入全部或部分相同的值reverse()用于颠倒数组中元素的顺序sort()用原地算法对数组的元素进行排序,并返回数组splice()向/从数组中添加/删除项目,然后返回被删除的项目slice()可提取字符串的某个部分,并以新的字符串返回被提取的部分×concat()用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组×join()将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串×every()对数组中每一项都运行传入的函数,如果对每一项函数都返回true,则这个方法返回true×some()对数组中每一项都运行传入的函数,如果有一项函数返回true,则这个方法返回true×filter()对数组每一项都运行传入的函数,函数返回true的项会组成数组之后返回×map()对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组×forEach()对数组每一项都运行传入的函数,没有返回值×keys()返回数组索引的迭代器×values()返回数组元素的迭代器×entries()返回 索引/值 对的迭代器×reduce()对数组中的每个元素执行一个由您提供的reducer函数,将其结果汇总为单个返回值×reduceRight()从数组的末尾向前将数组中的数组项做累加×indexOf()返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1×lastIndexOf()返回查找元素在数组中的位置,从数组末尾开始向前查找×includes()用来判断一个数组是否包含一个指定的值,如果包含则返回 true,否则返回false×find()返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined×findIndex()返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1×toSting()返回由数组中每个值的等效字符串拼接而成的一个用逗号分隔的字符串×toLocaleString()返回一个逗号分隔的数组值的字符串×constructor()返回数组函数的引用,也就是调用这个方法的数组本身×flat()会按照一个可指定的深度递归遍历数组,将所有元素与遍历到的子数组中的元素合并为一个新数组返回×flatMap()使用映射函数映射每个元素,然后将结果压缩成一个新数组×
    • 栈和队列方法(4个
    • 复制和填充方法(2个
    • 排序方法(2个
    • 操作方法(4个
    • 迭代方法(5个
    • 迭代器方法(3个
    • 归并方法(2个
    • 搜索查找方法(5个
    • 转换方法(2个
    • 扁平化方法(2个

    (1)栈和队列方法

    push()

    方法描述返回值
    push()向数组的末尾添加一个或多个元素把指定的值添加到数组后的新长度
    参数描述
    newelement1必需。要添加到数组的第一个元素newelement2可选。要添加到数组的第二个元素newelementX可选。可添加多个元素
    let arr = ['js','css','html'];
    console.log(arr.push('go','node.js')); // 5
    console.log(arr); //  ["js", "css", "html", "go", "node.js"]
    
    let arr1 = ['js','css','html'];
    let array = ['go','node.js'];
    console.log(arr1.push(...array)); // 5
    console.log(arr1); // ["js", "css", "html", "go", "node.js"]
    

    小知识点:

    let arr = ['js','css','html'];
    arr[arr.length] = 'go';
    console.log(arr); // ["js", "css", "html", "go"]
    

    pop()

    方法描述返回值
    pop()删除并返回数组的最后一个元素返回被删除的元素
    参数描述
    无需传参无需描述
    let colors = ['red','green','blue']
    console.log(colors.pop()); // blue
    console.log(colors); // ["red", "green"]
    

    小知识点:

    let colors = ['red','green','blue'];
    colors.length = colors.length - 1;
    console.log(colors); //  ["red", "green"]
    

    Tips:

    let array = [];
    console.log(array.push('red','green')); // 2
    console.log(array); // ["red", "green"]
    console.log(array.pop()); // green
    console.log(array); // ["red"]
    

    unshift()

    方法描述返回值
    unshift()向数组的开头添加一个或更多元素把指定的值添加到数组后的新长度
    参数描述
    newelement1必需。向数组添加的第一个元素newelement2可选。向数组添加的第二个元素newelementX可选。可添加若干个元素
    let colors = ['white'];
    console.log(colors.unshift('red','blue')); // 3
    console.log(colors); // ["red", "blue", "white"]
    

    shift()

    方法描述返回值
    shift()把数组的第一个元素从其中删除返回第一个元素的值
    参数描述
    无需传参无需描述
    let colors = ['red','black'];
    console.log(colors.shift()); // red
    console.log(colors); // ["black"]
    

    Tips:

    (2)复制和填充方法

    copyWithin()

    方法描述返回值
    copyWithin()浅复制数组的一部分到同一数组中的另一个位置返回修改后的原数组
    参数描述
    target必需。复制到指定目标索引位置start可选。元素复制的起始位置end可选。停止复制的索引位置 (默认为 array.length)。如果为负值,表示倒数
    let ints = [0,1,2];
    let copyRes = ints.copyWithin(1);
    console.log(copyRes); //  [0, 0, 1]
    console.log(ints); //  [0, 0, 1]
    console.log(copyRes === ints); // true
    

    fill()

    方法描述返回值是否改变原数组实例
    fill()向一个已有的数组中插入全部或部分相同的值返回填充后的原数组
    参数描述
    value必需。填充的值start可选。开始填充位置end可选。停止填充位置 (默认为 array.length)
    let zeroes = [0,0,0,0,0];
    let zeroesRes = zeroes.fill(5);
    console.log(zeroes); // [5, 5, 5, 5, 5]
    console.log(zeroesRes === zeroes); // true
    console.log(zeroes.fill(3,1)); // [5, 3, 3, 3, 3]
    console.log(zeroes); // [5, 3, 3, 3, 3]
    console.log(zeroes.fill(1,3,5)); // [5, 3, 3, 1, 1]
    console.log(zeroes); // [5, 3, 3, 1, 1]
    

    Tips:

    let ints = [0,1,2,3];
    // 索引超出边界,忽略
    ints.copyWithin(1,10,13);
    console.log(ints); // [0,1,2,3]
    // 索引过低,超出边界,忽略
    ints.copyWithin(2,-15,-12);
    console.log(ints); // [0,1,2,3]
    // 索引反向,忽略
    ints.copyWithin(1,3,1);
    console.log(ints); // [0,1,2,3]
    // 部分索引可用,填充可用索引部分
    ints.copyWithin(1,2,6);
    console.log(ints); // [0,2,3,3]
    
    let zeroes = [0,0,0,0,0];
    // 当开始索引和结束索引取负值时,相当于:将开始索引和结束索引都加上 zeroes.length
    // zeroes.fill(8,1,4);
    zeroes.fill(8,-4,-1);
    console.log(zeroes); // [0,8,8,8,0]
    // 索引超出边界,忽略
    zeroes.fill(1,10,15);
    console.log(zeroes); // [0,8,8,8,0]
    // 索引过低,超出边界,忽略
    zeroes.fill(1,-15,-12);
    console.log(zeroes); // [0,8,8,8,0]
    // 索引反向,忽略
    zeroes.fill(1,3,1);
    console.log(zeroes); // [0,8,8,8,0]
    // 部分索引可用,填充可用索引部分
    zeroes.fill(1,3,10);
    console.log(zeroes); // [0, 8, 8, 1, 1]
    

    (3)排序方法

    reverse()

    方法描述返回值是否改变原数组实例
    reverse()用于颠倒数组中元素的顺序返回颠倒后的原数组
    参数描述
    无需参数无需描述
    let value = [1,2,3,4,5,6];
    console.log(value.reverse()); // [6, 5, 4, 3, 2, 1]
    console.log(value); // [6, 5, 4, 3, 2, 1]
    console.log(value.reverse() === value); // true
    

    sort()

    方法描述返回值是否改变原数组实例
    sort()用原地算法对数组的元素进行排序返回排序后的原数组
    参数描述
    sortby可选。规定排序顺序。必须是函数
    • 当不传参数时
    let value = [1,2,3,5,8,9,10,16,20,50];
    console.log(value.sort()); //  [1, 10, 16, 2, 20, 3, 5, 50, 8, 9]
    
    • 传入比较函数

    这时候排序的结果就是我们结果就是我们想要的

    let value = [1,2,3,5,8,9,10,16,20,50];
    function compare(a,b) {
        if(a < b) return -1
        else if(a > b) return 1
        else return 0;
    }
    value.sort(compare);
    console.log(value); // [1, 2, 3, 5, 8, 9, 10, 16, 20, 50]
    

    当想要结果按降序排列的话将if条件反过来即可

    let value = [1,2,3,5,8,9,10,16,20,50];
    function compare(a,b) {
        if(a > b) return -1
        else if(a < b) return 1
        else return 0;
    }
    value.sort(compare);
    console.log(value); // [50, 20, 16, 10, 9, 8, 5, 3, 2, 1]
    

    上面的代码也可简写为:

    let value = [1,2,3,5,8,9,10,16,20,50];
    value.sort((a,b) => a > b ? -1 : a > b ? 1 : 0);
    console.log(value); // [50, 20, 16, 10, 9, 8, 5, 3, 2, 1]
    

    上面的代码还可简写为:

    let value = [1,2,3,5,8,9,10,16,20,50];
    value.sort((a,b) => b - a); // a - b 升序,b - a 降序
    console.log(value); // [50, 20, 16, 10, 9, 8, 5, 3, 2, 1]
    
    • 数组对象按某个属性排序
    let array = [
        {'name':'js','grade':80},
        {'name':'java','grade':50},
        {'name':'go','grade':100},
    ]
    array.sort(function(a,b) {
        return b.grade - a.grade;
    })
    console.log(array);
    // [{'name':'go','grade':100},{'name':'js','grade':80},{'name':'java','grade':50}]
    
    • 手写一个sort函数
    function sort(array,callback) {
        for (const n in array) {
            for (const m in array) {
                if(callback(array[n],array[m]) < 0){
                    const temp = array[n];
                    array[n] = array[m];
                    array[m] = temp;
                }
            }
        }
        return array;
    };
    let arr = [10,52,2,3,7];
    sort(arr,function(a,b){
        return a - b
    })
    console.log(arr); // [2, 3, 7, 10, 52] 
    

    Tips:

    (4)操作方法

    splice()

    方法描述返回值是否改变原数组实例
    splice()向/从数组中添加/删除项目返回被删除元素的组成的数组
    参数描述
    index必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置howmany必需。要删除的项目数量。如果设置为 0,则不会删除项目index可选。向数组添加的新项目
    let nums = [1,2,3,4,5,6,7,8,9,10];
    console.log(nums.splice(0,2)); // [1, 2]
    console.log(nums); // [3, 4, 5, 6, 7, 8, 9, 10]
    let colors = ['red','green'];
    console.log(colors.splice(0,1,'black','white')); // ["red"]
    console.log(colors); // ["black", "white", "green"]
    

    Tips:

    let nums = [1,2,3,4,5,6,7,8,9,10];
    console.log(nums.splice()); // []
    console.log(nums); // [1,2,3,4,5,6,7,8,9,10]
    console.log(nums.splice(3)); // [4, 5, 6, 7, 8, 9, 10]
    console.log(nums); // [1, 2, 3]
    

    slice()

    方法描述返回值是否改变原数组实例
    slice()可提取字符串的某个部分以新数组的形式返回被提取的部分×
    参数描述
    start可选。规定从何处开始选取,包含这个位置end可选。规定从何处结束选取,不包含这个位置
    let colors = ['red','blue'];
    let colors2 = colors.slice();
    let colors3 = colors.slice(1);
    let colors4 = colors.slice(0,1);
    console.log(colors); //  ["red", "blue"]
    console.log(colors2); // ["red", "blue"]
    console.log(colors3); // ["blue"]
    console.log(colors4); // ["red"]
    

    Tips:

     let colors = ['red','blue','green'];
    // 这个数组的长度为3,所以colors.slice(-3,-1) 相当于 colors.slice(0,2)
    console.log(colors.slice(-3,-1)); //  ["red", "blue"]
    console.log(colors.slice(0,2)); //  ["red", "blue"]
    
    // 因为colors.slice(-6,-4) 加上数组长度分别为 -3,-1,所以返回空值
    // 但是colors.slice(-6,-4) 结果并不等于 colors.slice(-3,-1)的结果
    // 因为 colors.slice(-3,-1) 相当于 colors.slice(0,2)
    console.log(colors.slice(-6,-4)); // []
    console.log(colors.slice(-3,-1)); // ["red", "blue"]
    
    // colors.slice(-8,-1) 加上数组长度分别为 -5,2,有一部分是在数组索引范围内的
    // 所以这部分是生效的
    console.log(colors.slice(-8,-1)); // ["red", "blue"]
    
    // colors.slice(-5,2) 加上数组长度为 -2,2
    // 但是 colors.slice(-2,2) 加上数组长度为 1,2
    // 所以他们结果是不同的
    console.log(colors.slice(-5,2)); // ["red", "blue"]
    console.log(colors.slice(-2,2)); // ["blue"]
    

    concat()

    方法描述返回值是否改变原数组实例
    concat()用于合并两个或多个数组返回合并后的新创建的数组×
    参数描述
    arrayX必需。该参数可以是具体的值,也可以是数组对象。可以是任意多个

    concat不仅可以合并数组,也可以将字符串合并到数组中去

    let colors = ['red','green'];
    let newColors = ['brown','blue'];
    console.log(colors.concat(newColors)); // ["red", "green", "brown", "blue"]
    console.log(colors.concat(['yellow'],newColors)); // ["red", "green", "yellow", "brown", "blue"]
    console.log(colors.concat('white',newColors)); // ["red", "green", "white", "brown", "blue"]
    

    Tips:

    let colors = ['red'];
    console.log(colors.concat('green','blue')); // ["red", "green", "blue"]
    console.log(colors); // ["red"]
    
    let newColors = ['red'];
    console.log(colors.push('green','blue')); // 3
    console.log(colors); // ["red", "green", "blue"]
    

    join()

    方法描述返回值是否改变原数组实例
    join()将一个数组的所有元素连接成一个字符串并返回返回连接后的字符串×
    参数描述
    separator可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符
    let colors = ['red','green','blue'];
    console.log(colors.join()); // red,green,blue
    console.log(colors.join(',')); // red,green,blue
    console.log(colors.join('||')); // red||green||blue
    console.log(colors.join(undefined)); // red,green,blue
    console.log(colors.join(null)); // rednullgreennullblue
    

    Tips:

    let colors = ['red','green','blue']; 
    console.log(colors.join(undefined)); // red,green,blue
    let colors1 = ['red',null,undefined,'blue']; 
    console.log(colors1.join()); // red,,,blue
    

    (5)迭代方法

    every()

    方法描述返回值是否改变原数组实例
    every()对数组中每一项都运行传入的函数,如果对 每一项 函数都返回 true ,则这个方法返回 true返回一个布尔类型的值×
    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值

    第一个参数(函数)的参数:

    参数描述
    currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象
    let numbers = [1,2,3,4,5,4,3,2,1];
    let everyResult = numbers.every((item,index,numbers) => item > 2);
    console.log(everyResult); // false
    

    Tips:

    let numbers = [];
    let everyResult = numbers.every((item,index,numbers) => item > 5);
    console.log(everyResult); // true
    

    some()

    方法描述返回值是否改变原数组实例
    some()对数组中每一项都运行传入的函数,如果 有一项 函数返回 true ,则这个方法返回 true返回一个布尔类型的值×
    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值

    第一个参数(函数)的参数:

    参数描述
    currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象

    注: every()some() 接收的参数是一样的,只是 every() 需要函数 每一项 都返回 true ,这个方法才会返回 true ,而 some() 只需要函数 某一项 返回 true ,这个方法就会返回 true

    let numbers = [1,2,3,4,5,4,3,2,1];
    let everyResult = numbers.every((item,index,numbers) => item > 2);
    console.log(everyResult); // false
    let someResult = numbers.some((item,index,numbers) => item > 2);
    console.log(someResult); // true
    

    filter()

    方法描述返回值是否改变原数组实例
    filter()对数组每一项都运行传入的函数,函数返回 true 的项会组成数组之后返回返回一个数组×
    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值

    第一个参数(函数)的参数:

    参数描述
    currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象
    let numbers = [1,2,3,4,5,4,3,2,1];
    let filterResult = numbers.filter((item,index,numbers) => item > 2);
    console.log(filterResult); // [3, 4, 5, 4, 3]
    

    map()

    方法描述返回值是否改变原数组实例
    map()对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组返回一个数组×
    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值

    第一个参数(函数)的参数:

    参数描述
    currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象
    let numbers = [1,2,3,4,5,4,3,2,1];
    let mapResult = numbers.map((item,index,number) => item*2);
    console.log(mapResult); //  [2, 4, 6, 8, 10, 8, 6, 4, 2]
    

    Tips:

    let numbers = [1,2,3,4,5,4,3,2,1];
    let filterResult = numbers.filter((item,index,number) => item * 2);
    let mapResult = numbers.map((item,index,number) => item * 2);
    let filterResult1 = numbers.filter((item,index,number) => item > 2);
    let mapResult1 = numbers.map((item,index,number) => item > 2);
    console.log(filterResult); //  [1, 2, 3, 4, 5, 4, 3, 2, 1]
    console.log(mapResult); // [2, 4, 6, 8, 10, 8, 6, 4, 2]
    console.log(filterResult1); //  [3, 4, 5, 4, 3]
    console.log(mapResult1); //  [false, false, true, true, true, true, true, false, false]
    console.log(numbers); //  [1, 2, 3, 4, 5, 4, 3, 2, 1]
    

    forEach()

    方法描述返回值是否改变原数组实例
    forEach()对数组每一项都运行传入的函数,没有返回值undefined×
    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值

    第一个参数(函数)的参数:

    参数描述
    currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象
    let numbers = [1,2,3,4,5,4,3,2,1];
    let forEachResult = numbers.forEach((item,index,numbers) => {
        return item*5
    });
    console.log(forEachResult); // undefined
    console.log(numbers); // [1, 2, 3, 4, 5, 4, 3, 2, 1]
    

    forEach()本质上就是循环遍历数组,没有返回值,也不会改变原数组。

    总结

    (6)迭代器方法

    keys()

    方法描述返回值是否改变原数组实例
    keys()返回数组索引的迭代器返回一个类数组对象×
    参数描述
    obj可选。要返回其枚举自身属性的对象
    let colors = ['red','green'];
    console.log(colors.keys()); // Array Iterator {}
    console.log(Array.from(colors.keys())); // [0, 1]
    console.log(Array.of(...colors.keys())); // [0, 1]
    

    values()

    方法描述返回值是否改变原数组实例
    values()返回数组元素的迭代器返回一个类数组对象×
    参数描述
    obj可选。被返回可枚举属性值的对象
    let colors = ['red','green'];
    console.log(colors.values()); // Array Iterator {}
    console.log(Array.from(colors.values())); //  ["red", "green"]
    console.log(Array.of(...colors.values())); //  ["red", "green"]
    

    entries()

    方法描述返回值是否改变原数组实例
    entries()返回 索引/值 对的迭代器返回一个类数组对象×
    参数描述
    obj可选。被返回可枚举属性值的对象
    let colors = ['red','green'];
    console.log(colors.entries(colors)); // Array Iterator {}
    console.log(Array.from(colors.entries())); // [Array(2), Array(2)]
    console.log(Array.of(...colors.entries())); // [Array(2), Array(2)]
    

    一文详解JavaScript中的数组

    Tips:

    (7)归并方法

    reduce()

    方法描述返回值是否改变原数组实例
    reduce()对数组中的每个元素执行一个由您提供的reducer函数函数处理的结果,可以是任何类型×
    参数描述
    function(currentValue, index,arr)必需。用于执行每个数组元素的函数initialValue可选。传递给函数的初始值

    第一个参数(函数)的参数:

    参数描述
    total必需。初始值, 或者计算结束后的返回值currentValue必需。当前元素currentIndex可选。当前元素的索引arr可选。当前元素所属的数组对象
    let numbers = [1,2,3,2,1];
    let sum = numbers.reduce((prev,cur,index,array) => prev + cur);
    console.log(sum); // 9
    console.log(numbers); //  [1, 2, 3, 2, 1]
    

    reduceRight()

    方法描述返回值是否改变原数组实例
    reduceRight()从数组的末尾向前将数组中的数组项做累加函数处理的结果,可以是任何类型×
    参数描述
    function(currentValue, index,arr)必需。用于执行每个数组元素的函数initialValue可选。传递给函数的初始值

    第一个参数(函数)的参数:

    参数描述
    total必需。初始值, 或者计算结束后的返回值currentValue必需。当前元素currentIndex可选。当前元素的索引arr可选。当前元素所属的数组对象
    let numbers = [1,2,3,4,5];
    let sum = numbers.reduceRight((prev,cur,index,array) => prev + cur);
    console.log(sum); // 15
    console.log(numbers); // [1, 2, 3, 4, 5]
    

    Tips:

    (8)搜索查找方法

    JavaScript 提供了 3 个严格相等的搜索方法:indexOf()lastIndexOf()includes()

    indexOf()

    方法描述返回值是否改变原数组实例
    indexOf()返回在数组中可以找到一个给定元素的第一个索引返回数值类型×
    参数描述
    searchvalue必需。规定需检索的字符串值fromindex可选的整数参数。规定在字符串中开始检索的位置(包含这个位置)
    let numbers = [1,2,3,4,5];
    console.log(numbers.indexOf(4)); // 3
    console.log(numbers.indexOf(4,3)); // 3
    // 如果没找到就返回 -1
    console.log(numbers.indexOf(40)); // -1
    

    lastIndexOf()

    方法描述返回值是否改变原数组实例
    lastIndexOf()返回查找元素在数组中的位置,从数组末尾开始向前查找返回数值类型×
    参数描述
    searchvalue必需。规定需检索的字符串值fromindex可选的整数参数。规定在字符串中开始检索的位置(包含这个位置)
    let numbers = [1,2,3,4,5,4,3,2,1];
    console.log(numbers.lastIndexOf(4)); // 5
    console.log(numbers.lastIndexOf(4,4)); // 3
    // 如果没找到就返回 -1
    console.log(numbers.lastIndexOf(40)); // -1
    

    includes()

    方法描述返回值是否改变原数组实例
    includes()用来判断一个数组是否包含一个指定的值返回布尔类型×
    参数描述
    searchvalue必需。规定需检索的字符串值fromindex可选的整数参数。规定在字符串中开始检索的位置(包含这个位置)
    let numbers = [1,2,3,4,5,4,3,2,1];
    console.log(numbers.includes(4)); // true
    console.log(numbers.includes(4,7)); // false
    console.log(numbers.includes(40)); // false
    

    JavaScript 也允许按照定义的断言函数搜索数组,find()findIndex() 使用了断言函数。

    find()

    方法描述返回值是否改变原数组实例
    find()返回数组中满足提供的测试函数的第一个元素的值返回符合条件的元素值,可以是任何类型×
    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值

    第一个参数(函数)的参数:

    参数描述
    currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象
    const people = [
        {
            name: 'Matt',
            age: 27
        },
        {
            name: 'xiaoming',
            age: 29
        }
    ];
    console.log(people.find((element, index, array) => element.age > 28)); // {name: "xiaoming", age: 29}
    

    findIndex()

    方法描述返回值是否改变原数组实例
    findIndex()返回数组中满足提供的测试函数的第一个元素的索引返回一个数值类型的值×
    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值

    第一个参数(函数)的参数:

    参数描述
    currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象
    const people = [
        {
            name: 'Matt',
            age: 27
        },
        {
            name: 'xiaoming',
            age: 29
        }
    ];
    console.log(people.findIndex((element, index, array) => element.age > 28)); // 1
    

    (9)转换方法

    toSting()

    方法描述返回值是否改变原数组实例
    toSting()返回由数组中每个值的等效字符串拼接而成的一个用逗号分隔的字符串返回字符串类型×
    参数描述
    无需参数无需描述
    let numbers = [1,2,3,4,5];
    let stringNumbers = numbers.toString();
    console.log(stringNumbers); // 1,2,3,4,5
    

    toLocaleString()

    方法描述返回值是否改变原数组实例
    toLocaleString()返回一个逗号分隔的数组值的字符串返回字符串类型×
    参数描述
    无需参数无需描述
    let numbers = [15000000];
    let stringNumbers = numbers.toLocaleString();
    console.log(stringNumbers); // 15,000,000
    

    (10)扁平化方法

    flat()

    方法描述返回值是否改变原数组实例
    flat()会按照一个可指定的深度递归遍历数组,将所有元素与遍历到的子数组中的元素合并为一个新数组返回返回一个数组类型×
    参数描述
    depth可选。指定要提取嵌套数组的结构深度,默认值为 1
    let array = [1,5,9,8,[1],[2,[1,[1,3,[1,9]]]]];
    console.log(array.flat(2));// [1, 5, 9, 8, 1, 2, 1, Array(3)]
    //使用 Infinity,可展开任意深度的嵌套数组
    console.log(array.flat(Infinity)); //  [1, 5, 9, 8, 1, 2, 1, 1, 3, 1, 9]
    

    flatMap()

    方法描述返回值是否改变原数组实例
    flatMap()使用映射函数映射每个元素,然后将结果压缩成一个新数组返回一个数组类型×
    参数描述
    function(currentValue, index,arr)必须。函数,数组中的每个元素都会执行这个函数thisValue可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值

    第一个参数(函数)的参数:

    参数描述
    currentValue必须。当前元素的值index可选。当前元素的索引值arr可选。当前元素属于的数组对象
    let array = [1,5,9,8];
    let flatMapRes = array.flatMap((item,index,array) => item * 3);
    console.log(flatMapRes); // [3, 15, 27, 24]
    

    5.总结

    这篇文章断断续续的也写了好几天,感叹总结文档也是件麻烦细致活,不比学习技术知识花的时间少,但是写文档也算把学到的知识输出出来了,可能以后自己忘了,也能回头来看看,毕竟,人的记忆力是敌不过时间的,好记性不如烂笔头嘛,写文档这种东西可能还是多多益善,然后大佬们看这篇文章如果发现有不妥或者错误的地方希望能指出来,我及时改正,谢谢了,然后后续有新的东西我也会补充进来的。

    一文详解JavaScript中的数组


    起源地下载网 » 一文详解JavaScript中的数组

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元