splice方法_[7000字]JavaScript数组所有方法基础总结

55b40d45aa72563e23605d19adbc3910.png

基础决定一个人的上限,很多时候我们感叹别人在实现一个功能时使用方法的精妙,并且反思,为什么别人想的出来自己却想不出来?我觉得主要是因为对于基础的掌握上有很大的差距。本文总结数组的所有方法的基础使用,希望对你有帮助,如果有错误,请指出。

ES6新增构造方法

Array.form()

语法

Array.from(arrayLike[, mapFn[, thisArg]])

作用

将类数组与可迭代对象转化为数组

参数

arrayLike
    想要转换成数组的伪数组对象或可迭代对象。
mapFn 可选
    如果指定了该参数,新数组中的每个元素会执行该回调函数。
thisArg 可选
    可选参数,执行回调函数 mapFn 时 this 对象。

返回值

转化后的新数组

注意事项

1、该类数组对象必须具有 length 属性,用于指定数组的长度。如果没有 length 属性,那么 转换后的数组是一个空数组。

// 没有length属性返回空数组
    let obj = {
        0:'a',
        1:'b',
        2:'c'
    }
    Array.from(obj); // []

2、该类数组对象的属性名必须为数值型或字符串型的数字,且数字必须是以0开始

// key不是数字或包含数字的字符串返回undefined
    let obj = {
        name:'九九欧',
        age:18,
        length:2
    }
    Array.from(obj); // [undefined, undefined]

    // key是数字但不是以0开始
    let obj = {
        2:'a',
        3:'b',
        4:'c',
        length:3
    }
    Array.from(obj); // [undefined, undefined, "a"]

    // 满足所有条件
    let obj = {
        0:'a',
        1:'b',
        2:'c',
        length:3
    }
    Array.from(obj); // ["a","b","c"]

Array.from()在转化对象时,要求过于苛刻,因此不适用于转化对象,它的应用场景主要是以下几个

从类数组对象(arguments)生成数组
let fn = function(){
        console.log(Array.from(arguments));
    }
    fn(1,2,3) // [1,2,3]
    
    
从 String 生成数组
    Array.from('九九欧'); // ["九","九","欧"]
    
    
从Set生成数组
    Array.from(new Set(["九","九","欧","欧"])); // ["九","欧"]
    
    
从Map生成数组
    Array.from(new Map([[1, 'a'], [2, 'b']])); // [[1, 'a'], [2, 'b']]


生成一个从0开始到指定数字的定长连续数组
    Array.from({length: 10}, (v, i) => i); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Array.of()

语法

Array.of(element0[, element1[, ...[, elementN]]])

作用

将参数依次转化为数组中的项

参数

任意个参数,将按顺序成为返回数组中的元素

返回值

转化后的新数组

Array.of()与Array()的区别

当传入多个参数时,两者之间没有区别

当传入一个参数且参数为数字时,区别如下

    Array.of(9);
    // [9]
    Array(9);
    // [empty × 9]

判断数组的方法

Array.isArray()

语法

Array.isArray(obj)

作用

判断传递的值是否是一个数组

参数

需要判断的值

返回值

布尔值

实例

    Array.isArray([])           // true
    Array.isArray({})           // false
    Array.isArray('a')          // false
    Array.isArray(1)            // false
    Array.isArray(null)         // false
    Array.isArray(undefined)    // false

改变自身值的方法

pop

语法

arr.pop()

作用

删除数组中最后一个元素

参数

返回值

从数组中删除的元素(数组为空时,返回undefined)

实例

    let ary = [1,2,3,4];
    console.log(ary.pop()); // 4
    console.log(ary);       // [1,2,3]

push

语法

arr.push(element1, ..., elementN)

作用

将一个或多个元素添加到数组的末尾

参数

被添加到数组末尾的元素

返回值

新数组的长度

实例

    let ary = [1,2,3];
    ary.push(4);
    console.log(ary); // [1,2,3,4]

应用

合并两个数组

思路:利用apply改变this的指向,以及apply传递参数时会将数组中的项以此传递

    let ary1 = [1,2,3];
    let ary2 = [4,5,6];
    let ary3 = Array.prototype.push.apply(ary1,ary2)
    console.log(ary1); // [1,2,3,4,5,6]
    console.log(ary3); // 6

shift

语法

arr.shift()

作用

删除数组的第一个元素

参数

返回值

被删除的元素

实例

    let ary = [1,2,3];
    let result = ary.shift();
    console.log(ary);     // [2,3]
    console.log(result);  // 1

unshift

语法

arr.unshift(element1, ..., elementN)

作用

在数组的开头添加一个或多个元素

参数

要添加到数组开头的元素或多个元素

返回值

新数组的长度

实例

    let ary = [4, 5, 6];
    let result = ary.unshift(1, 2, 3);
    console.log(ary);    // [1, 2, 3, 4, 5, 6]
    console.log(result); // 6

sort

语法

arr.sort([compareFunction])

作用

数组的元素进行排序

参数

compareFunction 可选
  用来指定按某种顺序进行排列的函数。
  如果省略,则元素按照转换为的字符串的各个字符的Unicode位点进行排序。
firstEl
  第一个用于比较的元素。
secondEl
  第二个用于比较的元素。

返回值

排序后的数组

实例

若 comparefn(a, b) < 0,那么a 将排到 b 前面(数字升序)

    let ary = [2,4,1,6,7,3,8,9,5];
    ary.sort(function(a,b){
        return a-b;
    })
    console.log(ary); // [1,2,3,4,5,6,7,8,9]

若 comparefn(a, b) = 0,那么a 和 b 相对位置不变

    let ary = [2,4,1,6,7,3,8,9,5];
    ary.sort(function(a,b){
        return a-a;
    })
    console.log(ary); // [2,4,1,6,7,3,8,9,5]

若 comparefn(a, b) > 0,那么a , b 将调换位置(数字降序)

    let ary = [2,4,1,6,7,3,8,9,5];
    ary.sort(function(a,b){
        return b-a;
    })
    console.log(ary); // [9,8,7,6,5,4,3,2,1]

省略参数时,元素按照转换为的字符串的各个字符的Unicode位点进行排序

    let ary = [9,8,7,6,5,4,3,2,1,0]
    ary.sort();
    console.log(ary);  // [0,1,2,3,4,5,6,7,8,9]
    
    let ary = ["e","d","c","b","a"]  
    ary.sort();
    console.log(ary); // ["a","b","c","d","e"]

splice

语法

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

作用

删除或替换现有元素、原地添加新的元素

参数

start
    指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;
    如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于array.length-n);	
    如果负数的绝对值大于数组的长度,则表示开始位置为第0位。
deleteCount (可选)
    整数,表示要移除的数组元素的个数。
    如果 deleteCount 大于 start 之后的元素的总数,则从 start 后面的元素都将被删除(含第 start 位)。
    如果 deleteCount 被省略了,或者它的值大于等于array.length - start
    (也就是说如果它大于或者等于start之后的所有元素的数量),那么start之后数组的所有元素都会被删除。
    如果 deleteCount 是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。
item1, item2, ...(可选)
    要添加进数组的元素,从start 位置开始。如果不指定,则 splice() 将只删除数组元素。

返回值

由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。

实例

删除某个元素

    let ary = [1,2,3,3,4,5,6]
    ary.splice(2,1);
    console.log(ary); // [1,2,3,4,5,6]

替换某个元素

    let ary = [1,2,3,3,5,6]
    ary.splice(3,1,4);
    console.log(ary); // [1,2,3,4,5,6]

删除最后n个元素

    let ary = [1,2,3,3,5,6]
    ary.splice(-2);
    console.log(ary); // [1,2,3,4]

reverse

语法

arr.reverse()

作用

颠倒数组中元素的位置

参数

返回值

颠倒后的数组

实例

    let ary = [1,2,3,4,5]
    ary.reverse();
    console.log(ary); // [5,4,3,2,1]

copyWith

语法

arr.copyWithin(target[, start[, end]])

作用

复制数组的一部分到同一数组中的另一个位置

参数

target
    0 为基底的索引,复制序列到该位置。
    如果是负数,target 将从末尾开始计算。
    如果 target 大于等于 arr.length,将会不发生拷贝。
    如果 target 在 start 之后,复制	的序列将被修改以符合 arr.length。
start
    0 为基底的索引,开始复制元素的起始位置。
    如果是负数,start 将从末尾开始计算。
    如果 start 被忽略,copyWithin 将会从0开始复制。
end
    0 为基底的索引,开始复制元素的结束位置。
    copyWithin 将会拷贝到该位置,但不包括end这个位置的元素。
    如果是负数,end将从末尾开始计算。
    如果end被忽略,copyWithin方法将会一直复制至数组结尾(默认为 arr.length)。

返回值

改变后的数组

实例

    [1, 2, 3, 4, 5].copyWithin(-2)         // [1, 2, 3, 1, 2]

    [1, 2, 3, 4, 5].copyWithin(0, 3)       // [4, 5, 3, 4, 5]

    [1, 2, 3, 4, 5].copyWithin(0, 3, 4)    // [4, 2, 3, 4, 5]

    [1, 2, 3, 4, 5].copyWithin(-2, -3, -1) // [1, 2, 3, 3, 4]

fill

语法

arr.fill(value[, start[, end]])

作用

用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。不包括终止索引

参数

value
    用来填充数组元素的值。
start (可选)
    起始索引,默认值为0。
end (可选)
    终止索引,默认值为 this.length(不包含终止索引)

返回值

修改后的数组

实例

    const ary = [1, 2, 3, 4];
    console.log(ary.fill(0, 2, 4)); // [1, 2, 0, 0]

    const ary = [1, 2, 3, 4];
    console.log(ary.fill(5, 1));    // [1, 5, 5, 5]

    const ary = [1, 2, 3, 4];
    console.log(ary.fill(6));       // [6, 6, 6, 6]

省略终止索引

    const ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    console.log(ary.fill(0, 2)); // [1, 2, 0, 0, 0, 0, 0, 0, 0, 0]

不改变自身值的方法

concat

语法

var new_array = old_array.concat(value1[, value2[, ...[, valueN]]])

作用

合并两个或多个数组

参数

valueN可选
    将数组和/或值连接成新数组。
    如果省略了valueN参数参数,则concat会返回一个它所调用的已存在的数组的浅拷贝。

返回值

新的 Array 实例

实例

合并两个数组

    const ary1 = ['九','九'];
    const ary2 = ['欧'];
    let ary3 = ary1.concat(ary2);
    console.log(ary3); // ['九','九','欧']

合并三个数组

    const ary1 = [1,2,3];
    const ary2 = [4,5,6];
    const ary3 = [7,8,9];
    let ary4 = ary1.concat(ary2,ary3);
    console.log(ary4); // [1,2,3,4,5,6,7,8,9]

将值连接到数组

    const ary1 = [1,2,3];
    const ary2 = [7,8,9];
    let ary3 = ary1.concat(4,5,6,ary2);
    console.log(ary3); // [1,2,3,4,5,6,7,8,9]
    }

flat

语法

var newArray = arr.flat([depth])

作用

将多维数组转化为一维数组

参数

指定要提取嵌套数组的结构深度,默认值为 1

返回值

一个包含将数组与字数组中所有元素的新数组

实例

    let ary = [1, 2, [3, [4,[5,[6,[7]]]]]];
    console.log(ary.flat());          // [1,2,3,[4,[5,[6,[7]]]]]
    console.log(ary.flat(2));         // [1,2,3,4,[5,[6,[7]]]]
    console.log(ary.flat(3));         // [1,2,3,4,5,[6,[7]]]
// 传入的参数为“Infinity”时,无论是几维数组都会变成1维数组
    console.log(ary.flat(Infinity));  // [1,2,3,4,5,6,7]

flat方法会移除数组中的空项

    let ary = [1, 2, , 4, 5];
    console.log(ary.flat()); // [1, 2, 4, 5]

flatMap

语法

var new_array = arr.flatMap(function callback(currentValue[, index[, array]]) { // return element for new_array }[, thisArg])

作用

使用映射函数映射每个元素,然后将结果压缩成一个新数组

参数

callback:
    可以生成一个新数组中元素的函数,包含一下三个参数:
currentValue:
    当前正在数组中处理的元素
index(可选):
    数组中正在处理的当前元素的索引
array:
    被调用map的数组
thisAry(可选):
    执行callback函数值,this的值

返回值

新数组

实例

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

工作原理

先map()再flat()

    let names = ['九', '九', '欧'];
    // 步骤 1: map
    let result = names.map((name, index) => [name, index]);    
    // [ ['九', 1], ['九', 2 ], ['欧',3]]
    // 步骤 2: flat
    result.flat();                                             
    // [ '九', 1, '九', 2 ,'欧',3]

    let names = ['九', '九', '欧'];
    let result = names.flatMap((name, index) => [name, index]); 
    // [ '九', 1, '九', 2 ,'欧',3]

join

语法

arr.join([separator])

作用

将一个数组(或一个类数组对象)的所有元素连接成一个字符

参数

separator 可选
    指定一个字符串来分隔数组的每个元素。
    如果需要,将分隔符转换为字符串。
    如果缺省该值,数组元素用逗号(,)分隔。
    如果separator是空字符串(""),则所有元素	之间都没有任何字符。

返回值

一个所有数组元素连接的字符串。如果 arr.length 为0,则返回空字符串

注意事项

如果一个元素为 undefined 或 null,它会被转换为空字符串

实例

    const ary = ['九', '九', '欧'];
    let ary = ary.join();       // "九,九,欧"
    let ary = ary.join(', ');   // "九, 九, 欧"
    let ary = ary.join(' + ');  // "九 + 九 + 欧"
    let ary = ary.join('');     // "九九欧"

slice

语法

arr.slice([begin[, end]])

作用

将数组中一部分元素浅复制存入新的数组对象

参数

begin (可选)
    提取起始处的索引(从 0 开始),从该索引开始提取原数组元素。
    如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取。
    slice(-2) 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。
    如果省略 begin,则 slice 从索引 0 开始。
    如果 begin 大于原数组的长度,则会返回空数组。
end (可选)
    提取终止处的索引(从 0 开始),在该索引处结束提取原数组元素。
    slice 会提取原数组中索引从 begin 到 end 的所有元素(包含 begin,但不包含 end)。
    slice(1,4) 会提取原数组中从第二个元素开始一直到第四个元素的所有元素 (索引	为 1, 2, 3的元素)。
    如果该参数为负数,则它表示在原数组中的倒数第几个元素结束抽取。 
    slice(-2,-1) 表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。
    如果 end 被省略,则 slice 会一直提取到原数组末尾。
    如果 end 大于数组的长度,slice 也会一直提取到原数组末尾。

返回值

一个含有被提取元素的新数组

实例

    const ary = [1,2,3,4,5];
    console.log(ary.slice(1,4));    // [2,3,4]
    console.log(ary.slice(0,100));  // [1,2,3,4,5]
    console.log(ary.slice(50,100)); // []

应用

将类数组转化为数组

    function fn() {
        return Array.prototype.slice.call(arguments);
    }
    console.log(fn(1, 2, 3)); // [1, 2, 3]

toString

语法

arr.toString()

作用

返回数组的字符串形式

参数

返回值

数组的字符串形式

实例

    const array = ['九', '九', '欧'];
    let str = array.toString();
    console.log(str);        // 九,九,欧
    console.log(typeof str); // string

toLocaleString

语法

arr.toLocaleString([locales[,options]]);

作用

返回一个字符串表示数组中的元素。数组中的元素将使用各自的 toLocaleString 方法转成字符串,这些字符串将使用一个特定语言环境的字符串(如逗号 ",")隔开

参数

locales 可选
    带有BCP 47语言标记的字符串或字符串数组。
options 可选
    一个可配置属性的对象,对于数字 Number.prototype.toLocaleString()
    对于日期	Date.prototype.toLocaleString().

返回值

表示数组元素的字符串

indexOf

语法

arr.indexOf(searchElement[, fromIndex])

作用

返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1

参数

searchElement
    要查找的元素
fromIndex 可选
    开始查找的位置。
    如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。
    如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找,以此类推。 
    注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。
    如果抵消后的索引值仍小于0,则整个数组都将会被	查询。其默认值为0.

返回值

首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1

实例

    const ary = [5,6,7,8,5];
    ary.indexOf(5);     // 0
    ary.indexOf(1);     // -1
    ary.indexOf(5, 2);  // 4
    ary.indexOf(5, -2); // 4

lastIndexOf

语法

arr.lastIndexOf(searchElement[, fromIndex])

作用

查找元素在数组中最后一次出现时的索引,如果没有,则返回-1

参数

searchElement
    被查找的元素。
fromIndex 可选
    从此位置开始逆向查找。默认为数组的长度减 1(arr.length - 1),即整个数组都被查	找。
    如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。
    如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。

返回值

数组中该元素最后一次出现的索引,如未找到返回-1

实例

    const ary = [5, 6, 7, 8, 5];
    ary.lastIndexOf(5);     // 4
    ary.lastIndexOf(1);     // -1
    ary.lastIndexOf(5, 2);  // 0
    ary.lastIndexOf(5, -2); // 0

includes

语法

arr.includes(valueToFind[, fromIndex])

作用

判断一个数组是否包含一个指定的值

参数

valueToFind
    需要查找的元素值。
fromIndex 可选
    从fromIndex 索引处开始查找 valueToFind。
    如果为负值,则按升序从 array.length 	+ fromIndex 的索引开始搜 
    (即使从末尾开始往前跳 fromIndex 的绝对值个索引,	然后往后搜寻)默认为 0。

返回值

布尔值

注意事项

使用 includes()比较字符串和字符时区分大小写 includes方法与indexOf方法的功能有些类似,不同点在于includes方法可以找到NaN而indexOf不行

实例

    [1, 2, 3].includes(2);                 // true
    [1, 2, 3].includes(4);                 // false
    [1, 2, null].includes(null);           // true
    [1, 2, undefined].includes(undefined); // true
    [1, 2, NaN].includes(NaN);             // true

toSource

语法

array.toSource()

作用

返回一个代表该数组的源代码的字符串

参数

返回值

代表数组源码的字符串

实例

    var array = ['a', 'b', 'c'];
    console.log(array.toSource()); // ["a", "b", "c"]

遍历数组的方法

forEach

语法

arr.forEach(callback(currentValue [, index [, array]])[, thisArg])

作用

对数组的每个元素执行一次给定的函数

参数

callback
    为数组中每个元素执行的函数,该函数接收一至三个参数:
currentValue
    数组中正在处理的当前元素。
index 可选
    数组中正在处理的当前元素的索引。
array 可选
    forEach() 方法正在操作的数组。
thisArg 可选
    当执行回调函数 callback 时,用作 this 的值。

返回值

undefined

注意事项

1、forEach() 遍历的范围在第一次调用 callback 前就会确定。调用 forEach 后添加到数组中的项不会被 callback 访问到

    const ary = [1,2,3,4,5];
    ary.forEach(item =>{
        if(item === 1){
            ary.push(6) // 遍历开始后数组新增的项不会被遍历
        }
        console.log(item);  
    })
    // 1
    // 2
    // 3
    // 4
    // 5

2、如果已经存在的值被改变,则传递给 callback 的值是 forEach() 遍历到他们那一刻的值。已删除的项不会被遍历到

    const ary = [1,2,3,4,5];
    ary.forEach(item =>{
        if(item === 1){
            ary.pop()//在遍历到数组第一项时就把最后一项删除了,被删除的项不会被遍历
        }
        console.log(item);  
    })
    // 1
    // 2
    // 3
    // 4

3、如果已访问的元素在迭代时被删除了(例如使用 shift()),之后的元素将被跳过

    const ary = [1,2,3,4,5];
    ary.forEach(item =>{
        if(item === 3){
            ary.shift();//遍历到第2项时,以访问的元素被删除,则下一项跳过遍历
        }
        console.log(item);  
    })
    // 1
    // 2
    // 3
    // 5

4、forEach() 为每个数组元素执行一次 callback 函数;与 map() 或者 reduce() 不同的是,它总是返回 undefined 值,并且不可链式调用。因为此特性,forEach一般用于链式调用的结尾。

    let ary = [1, 2, 3, 4, 5]
    let result = ary.forEach(item => {})
    console.log(result) // undefined

5、除了抛出异常以外,没有办法中止或跳出 forEach() 循环。下面是for与forEach的对比。

    const ary = [1, 2, 3, 4, 5];
    for (let i = 0; i < ary.length; i++) {
        if(ary[i] === 3){
            console.log("找到了");
            break;
        }
        console.log(ary[i]);
    }
    // 1
    // 2
    // 找到了
    ary.forEach(item => {
        if(item === 3){
            console.log("找到了");
        }
        console.log(item);
    })
    // 1
    // 2
    // 找到了
    // 3
    // 4
    // 5

6、forEach()虽然不能跳出整个循环,但是可以跳出当前循环,作用与循环中的continue类似

    const ary = [1, 2, 3, 4, 5];
    ary.forEach(item => {
        if (item === 3) {
            console.log("找到了");
            return;
        }
        console.log(item);
    })
    // 1
    // 2
    // 找到了
    // 4
    // 5

7、forEach()中不可以使用break或者continue,否则会报错 8、forEach()不对未初始化的值进行任何操作

    const ary = [1, 2, , 4];
    ary.forEach(item => {
        console.log(element);
    });
    // 1
    // 2
    // 4

9、使用抛出异常的方式终止forEach()循环

    try {
        let ary = [1, 2, 3, 4, 5];
        ary.forEach(item => {
            if (item === 3) {
                throw new Error("EndIterative");
            }
            console.log(item);
        });
    } catch (e) {
        if (e.message != "EndIterative") {
            throw e;
        }
    }
    // 1
    // 2

应用

数组扁平化

    function flatten(arr) {
        const result = [];
        arr.forEach((item) => {
            if (Array.isArray(item))
                result.push(...flatten(item));
            else
                result.push(item);
        })
        return result;
    }

filter

语法

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])

作用

使用传入的函数测试所有元素,并返回所有通过测试的元素组成的新数组

参数

callback
    用来测试数组的每个元素的函数。返回 true 表示该元素通过测试,保留该元素,	false 则不保留。它接受以下三个参数:
element
    数组中当前正在处理的元素。
index可选
    正在处理的元素在数组中的索引。
array可选
    调用了 filter 的数组本身。
thisArg可选
    执行 callback 时,用于 this 的值。

返回值

由通过测试的元素组成的新数组,如果没有元素通过测试,则返回空数组

实例

    var ary1 = [1, 2, 3, 4, 5];
    var ary2 = ary1.filter(value => value > 3);
    console.log(ary2); // [4,5]

应用

1、数组对象的键值搜索

    let users = [
    { 'user': '九九', 'age': 18 },
    { 'user': '八八', 'age': 19 },
    { 'user': '七七', 'age': 20 },
    ]
    let filtered = users.filter(n => n.age===18)
    console.log(filtered)   // [{'user': '九九'}]

2、数组去重

    let ary = [1,1,2,2,3,3,4,4,5,5]
    let result = ary.filter((item, index, arr) => arr.indexOf(item) === index)
    // indexOf只返回找到的第一个值的下标
    console.log(result); // [1,2,3,4,5]

3、去除空字符串以及null和undefined 思路:利用了空字符串和null、undefined转化为boolean的结果为false

    let ary = ['A', '', 'B', null, undefined, 'C', '  ']
    let result = ary.filter((item, idx, arr) => item && item.trim())
    console.log(result) //["A", "B", "C"]

map

语法

var new_array = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])

作用

创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值

参数

callback
    生成新数组元素的函数,使用三个参数:
currentValue
    callback 数组中正在处理的当前元素。
index可选
    callback 数组中正在处理的当前元素的索引。
array可选
    map 方法调用的数组。
thisArg可选
    执行 callback 函数时值被用作this。

返回值

一个由原数组每个元素执行回调函数后的结果组成的新数组

实例

    let numbers = [1, 4, 9];
    let result = numbers.map(Math.sqrt);

    let numbers = [1, 4, 9];
    let result = numbers.map(num => num * 2);
    console.log(result); // [2,8,18]

every

语法

arr.every(callback[, thisArg])

作用

测试一个数组内的所有元素是否都能通过某个指定函数的测试

参数

callback
    用来测试每个元素的函数,它可以接收三个参数:
element
    用于测试的当前值。
index可选
    用于测试的当前值的索引。
array可选
    调用 every 的当前数组。
thisArg
    执行 callback 时使用的 this 值。

返回值

布尔值

实例

    let arr1 = [12, 5, 8, 130, 44];
    let arr2 = [12, 54, 18, 130, 44];
    arr1.every(x => x >= 10); // false
    arr2.every(x => x >= 10); // true

some

语法

arr.some(callback(element[, index[, array]])[, thisArg])

作用

测试数组中是不是至少有1个元素通过了被提供的函数测试

参数

callback
    用来测试每个元素的函数,接受三个参数:
element
    数组中正在处理的元素。
index 可选
    数组中正在处理的元素的索引值。
array可选
    some()被调用的数组。
thisArg可选
    执行 callback 时使用的 this 值。

返回值

布尔值

实例

    let arr1 = [1,2,3,4,5];            
    let arr2 = [1,2,3,4,5,12];         
    arr1.some(x => x > 10); // false
    arr2.some(x => x > 10); // true 

reduce

语法

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

作用

对数组中的每个元素执行一个reducer函数,并将其结果汇总为单个返回值

参数

callback
    执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数:
accumulator
    累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见	于下方)。
currentValue
    数组中正在处理的元素。
index 可选
    数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,	否则从索引1起始。
array可选
    调用reduce()的数组
initialValue可选
    作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将	使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。

返回值

函数累计处理的结果

实例

    let arr = [1, 2, 3, 4]                               
    let sum = arr.reduce((acc, cur) => {                 
        return acc + cur;                               
    });                                                        
    console.log(sum); // 10   

应用

将二维数组转化为一维数组

    let arr = [[0, 1],[2, 3],[4, 5]]    
    let flattened = arr.reduce(            
        (acc, cur) => acc.concat(cur)  
    );                                        
    console.log(flattened); // [0,1,2,3,4,5]

reduceRight

语法

arr.reduceRight(callback(accumulator, currentValue[, index[, array]])[, initialValue])

作用

接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值

参数

callback
    一个回调函数,用于操作数组中的每个元素,它可接受四个参数:
accumulator
    累加器:上一次调用回调函数时,回调函数返回的值。首次调用回调函数时,如果 initialValue 存在,累	加器即为 initialValue,否则须为数组中的最后一个元素(详见下方 initialValue 处相关说明)。
currentValue
    当前元素:当前被处理的元素。
index可选
    数组中当前被处理的元素的索引。
array可选
    调用 reduceRight() 的数组。
initialValue可选 
    首次调用 callback 函数时,累加器 accumulator 的值。
    如果未提供该初始值,则将使用数组中的最后一个元素,并跳过该元素。
    如果不给出初始值,则需保证数组不为空。否则,在空数组上调用 reduce 或 reduceRight 且未提供初始值(例如 [].reduce( (acc, cur, idx, arr) => {} ) )的话,会导致类型错误 TypeError: reduce of empty array with no initial value。

返回值

执行之后的值

entires

语法

arr.entries()

作用

返回一个新的Array Iterator对象,该对象包含数组中每个索引的键/值对

参数

返回值

一个新的 Array 迭代器对象

实例

    let arr = ["a", "b", "c"];
    let iterator = arr.entries();
    console.log(iterator.next().value); // [0, "a"]
    console.log(iterator.next().value); // [1, "b"]
    console.log(iterator.next().value); // [2, "c"]
    console.log(iterator.next().value); // undefined, 迭代器处于数组末尾时, 再迭代就会返回undefined

find

语法

arr.find(callback[, thisArg])

作用

返回数组中满足提供的测试函数的第一个元素的值。都不满足则返回 undefined

参数

callback
    在数组每一项上执行的函数,接收 3 个参数:
element
    当前遍历到的元素。
index可选
    当前遍历到的索引。
array可选
    数组本身。
thisArg可选
    执行回调时用作this 的对象。

返回值

数组中第一个满足所提供测试函数的元素的值,都不满足则返回 undefined

实例

    let arr = [1, 3, 5, 7, 8, 9, 10];
    let result = arr.find(value => {     
        if (value % 2 == 0) {       
            return value             
        }                                 
    });                                       
    console.log(result); // 8               

fineIndex

语法

arr.findIndex(callback[, thisArg])

作用

判断数组中是否有满足测试函数的项

参数

callback
    针对数组中的每个元素, 都会执行该回调函数, 执行时会自动传入下面三个参数:
element
    当前元素。
index
    当前元素的索引。
array
    调用findIndex的数组。
thisArg
    可选。执行callback时作为this对象的值。

返回值

数组中通过提供测试函数的第一个元素的索引。若都未通过则返回-1

实例

    let arr = [1, 3, 5, 7, 8, 9, 10];
    let result = arr.findIndex(value => {
        if (value % 2 == 0) {       
            return value             
        }                                 
    });                                       
    console.log(result); // 4               

keys

语法

arr.keys()

作用

返回一个包含数组中每个索引键的Array Iterator对象

参数

返回值

一个新的 Array 迭代器对象

实例

    let arr = ["abc", "xyz"];                                               
    let iterator = arr.keys();                                               
    console.log(iterator.next()); // Object {value: 0, done: false}       
    console.log(iterator.next()); // Object {value: 1, done: false}       
    console.log(iterator.next()); // Object {value: undefined, done: true}

values

语法

arr.values()

作用

返回一个新的 Array Iterator 对象,该对象包含数组每个索引的值

参数

返回值

一个新的 Array 迭代器对象

实例

    let arr = ["abc", "def"];             
    let iterator = arr.values();           
    console.log(iterator.next().value); //abc
    console.log(iterator.next().value); //def

参考

MDN-Array.prototype

JavaScript数组所有API全解密

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值