JavaScript 史上最全array方法

90 阅读10分钟

大家好,我是行者酒不离手,在日常开发中,经常要处理数据,数组是比较常见的类型,有的时候不知道一些细节,经常需要去查阅一些数组方法,费时费力。同时作为一个合格的前端程序员的基本要求,也需要熟练掌握用法,并能够敏锐的察觉出在何种场景下使用哪种方法处理最优 ,下面我整理了一下,希望能对你有用。

forEach()

forEach() 方法为数组中每一项执行一次给定的回调函数。

「语法」

arr.forEach(callback(currentValue , index , array) ,thisArg)
  • currentValue : 数组当前项值

  • index : 数组当前项索引

  • arr : 数组对象本身

  • thisArg : 可选参数。当执行回调函数 callback 时,用作 this 的值。

「注意」

  • forEach 不会直接改变调用它的对象,但是那个对象可能会被 callback 函数改变。

  • forEach() 对于空数组是不会执行回调函数的。

这个方法初看没什么用,既不改变原数组,又没有返回值,正所谓没什么影响也没什么造化,堪称无用典范,但是他的作用隐藏在他的回调函数callback里,在这里你可以把数组的每个元素做任何处理,把处理结果挪做他用。

map()

map() 创建一个新的数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

「语法」

arr.map(callback(currentValue , index , array) ,thisArg)
  • currentValue : 数组当前项值 必须

  • index : 数组当前项索引 可选

  • arr : 数组对象本身可选

  • thisArg : 可选参数。当执行回调函数 callback 时,用作 this 的值。可选

「注意」

  • map不修改调用它的原数组本身

  • map() 在遍历时,元素范围已经确定,在遍历过程中添加的元素,不会加入到遍历的序列中。

这个方法和forEach() 比较就是有返回值,返回值是回调函数的执行结果组成的数组。

reduce()

reduce()数组元素累计器,返回一个合并的结果值。

「语法」

arr.reduce(callback(accumulator, currentValue, index, array), initialValue)
  • accumulator : 累计器,默认为数组元素第一个值

  • currentValue : 当前值

  • index : 当前元素索引 可选

  • array : 数组 可选

  • initialValue : 初始值 可选

reduce 有两个参数,一个是回调函数,一个是初始值。

它有两种取值情况:

  1. 当提供了 initialValue 初始值时, 那么accumulator 的值为 initialValue , currentValue 的值为 数组第一个值

  2. 当没有提供 initialValue 初始值时, 那么 accumulator 的值 为 数组第一个值, currentValue 为第二个值。

「注意」

  • 如果数组为空,且没有提供initialValue 初始值时,会抛出 TypeError .

  • 如果数组有一个元素,且没有提供initialValue 或者 提供了initialValue ,数组为空,那么唯一值被返回不会执行 callback 回调函数。

reduce() 方法经常被忽略,其实他可以解决很多问题,面试问的也比较多,比如数组扁平化,数组去重,排序。

留一个小问题:封装一个方法 ,用map() 方法实现reduce()方法的功能?

filter()

filter() 用来遍历原数组,过滤拿到符合条件的数组元素,形成新的数组元素。

「语法」

arr.some(callback(currentValue , index , array) ,thisArg)
  • currentValue : 数组当前项值 必须

  • index : 数组当前项索引 可选

  • arr : 数组对象本身可选

  • thisArg : 可选参数。当执行回调函数 callback 时,用作 this 的值。可选

「注意」

  • filter 不会改变原数组,它返回过滤后的新数组。

  • filter() 在遍历时,元素范围已经确定,在遍历过程中添加的元素,不会加入到遍历的序列中。

这个方法不多说,输入数组返回数组,很单一的用法。

find()

find() 返回满足特定条件的元素对象或者元素值, 不满足返回 undefined

「语法」

arr.find((element,index,array), thisArg)
  • element :当前元素

  • index : 当前元素索引 可选

  • array : 数组本身 可选

  • thisArg : 执行回调时用作this 的对象。可选

findIndex()

findIndex() 返回数组中符合条件的第一个元素的索引,没有,则返回 -1

「语法」

arr.findIndex((element,index,array), thisArg)
  • element :当前元素

  • index : 当前元素索引 可选

  • array : 数组本身 可选

  • thisArg : 执行回调时用作this 的对象。可选

这两个方法注意他的返回值,如果是undefined,注意后续处理机制

every()

every() 用来判断数组内所有元素是否符合某个条件,返回 「布尔值」

「语法」

arr.every(callback(currentValue , index , array) ,thisArg)
  • currentValue : 数组当前项值 必须

  • index : 数组当前项索引 可选

  • arr : 数组对象本身可选

  • thisArg : 可选参数。当执行回调函数 callback 时,用作 this 的值。可选

「注意」

  • 当所有的元素都符合条件才会返回true

  • every 不会改变原数组。

  • 若传入一个空数组,无论如何都会返回 true

some()

some() 用来判断数组元素是否符合某个条件,只要有一个元素符合,那么返回 true.

「语法」

arr.some(callback(currentValue , index , array) ,thisArg)
  • currentValue : 数组当前项值 必须

  • index : 数组当前项索引 可选

  • arr : 数组对象本身可选

  • thisArg : 可选参数。当执行回调函数 callback 时,用作 this 的值。可选

「注意」

  • some() 被调用时不会改变数组。

  • 如果用一个空数组进行测试,在任何情况下它返回的都是false

  • some() 在遍历时,元素范围已经确定,在遍历过程中添加的元素,不会加入到遍历的序列中。

这两个方法大同小异,都是判断数组包含元素的情况。

增删改查换

reverse()

reverse() 方法将数组中元素的位置颠倒,并返回该数组,空数组也可以,没有参数。

sort()

sort() 方法 进行排序并返回数组。默认排序顺序是将元素转换为字符串,然后比较它们的UTF-16代码单元值序列

这种处理方式是一个使用辅助的数据结构对输入进行转换的算法。但是,它允许有少量额外的存储空间来储存辅助变量。当算法运行时,输入通常会被输出覆盖。原地算法仅通过替换或交换元素来更新输入序列。

这个方法写起来方便,大量数据的话效率还是低的。

shift()

shift() 方法从数组中删除**「第一个」**元素,并返回该元素的值。此方法更改数组的长度。

「语法」

arr.shift()

pop()

pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。

用法和 shift 类似。

「语法」

arr.pop()

「注意」

  • 以上这两个方法, 如果数组为空则返回undefined

splice()

splice() 方法通过**「删除」「替换」**现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。

「语法」

array.splice(start,deleteCount, [item1,item2....])
  • start : 开始的索引

  • deleteCount : 删除的个数 可选

  • [item1,item2 .....] ;从开始的索引进行 添加的增加和替换的元素, 可选

「注意」

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

  • 如果只传递了开始的索引位置,则会删除索引后的所有元素对象

个人认为增删改查知道这一个方法就可以了。

push()

push() 方法将一个或多个元素添加到数组的**「末尾」**,并返回该数组的新长度。

「语法」

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

unshift()

unshift() 方法将一个或多个元素添加到数组的**「开头」,并返回该数组的「新长度」**。

indexOf()

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

「语法」

indexOf(searchElement)    或  indexOf(searchElement, fromIndex)
  • searchElement : 要查找的元素

  • fromIndex : 按指定的索引进行查找出现的指定元素的第一个索引。 可选

    • 如果索引大于或等于数组的长度,则返回-1

    • 如果提供的索引值为负数,则将其视为距数组末尾的偏移量

    • 如果提供的索引为负数,仍然从前到后搜索数组

    • 如果提供的索引为 0,则将搜索整个数组。

    • 默认值:0(搜索整个数组)。

inCludes()

includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。

「语法」

arr.includes(searchElement, fromIndex)
  • searchElement : 要查找的元素,查找时,区分大小写

  • fromIndex : 按指定的索引进行查找出现的指定元素的第一个索引。 可选

    • 从指定的索引进行查找

    • 如果为负值,则按升序从 array.length + fromIndex 的索引开始搜

    • 如果 fromIndex 大于等于数组的长度,则会返回 false,且该数组不会被搜索。

    • 默认为0

concat()

concat() 方法用于合并两个或多个数组。

「语法」

var new_array = old_array.concat([arr1][arr2])

「注意」

  • concat方法不会改变this或任何作为参数提供的数组,而是返回一个**「浅拷贝」**,它包含与原始数组相结合的相同元素的副本

    ❝ ❞

    • 对象引用(而不是实际对象):concat将对象引用复制到新数组中。原始数组和新数组都引用相同的对象。也就是说,如果引用的对象被修改,则更改对于新数组和原始数组都是可见的。这包括也是数组的数组参数的元素。

    • 数据类型如字符串,数字和布尔(不是StringNumberBoolean) 对象):concat将字符串和数字的值复制到新数组中。

toString()

toString() 返回一个字符串,表示指定的数组及其元素。

「当一个数组被作为文本值或者进行字符串连接操作时,将会自动调用其 toString 方法。」

对于数组对象,toString 方法连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素。

「语法」

arr.toString()

join()

join()方法通过连接数组元素用逗号或指定的分隔符字符串分隔,返回一个字符串。

如果数组只有一项,则将在不使用分隔符的情况下返回该项。

「语法」

join()join(separator)
  • separator : 指定的分割的 字符 可选

slice()

slice() 方法返回一个新的数组对象,这一对象是一个由 beginend 决定的原数组的**「浅拷贝」**(包括 begin,不包括end)。原始数组不会被改变。

「语法」

arr.slice(begin, end)
  • begin : 指定截取的**「开始」**索引 可选

    • 默认从0 开始

    • 如果begin 为负数,则以数组末尾开始 的 绝对值开始截取 slice(-2) 末尾第2个元素

    • 如果 begin 超出原数组的索引范围,则会返回空数组。

  • end : 指定截取的**「结束」**索引 可选

    • 如果 end 被省略,则 slice 会一直提取到原数组末尾。

    • 如果 end 大于数组的长度,slice 也会一直提取到原数组末尾。

    • 如果 end 为负数, 则它表示在原数组中的倒数第几个元素结束抽取。

fill()

fill() 方法用静态值填充数组中的指定元素。

您可以指定开始和结束填充的位置。如果未指定,则将填充所有元素。

「语法」

array.fill(value, start, end)
  • value 必需。用于填充数组的值。
  • start 可选。开始填充数组的索引(默认为 0)。
  • end 可选。停止填充数组的索引(默认为 array.length)。

注意」:fill() 会覆盖原始数组。

from()

from() 方法从具有 length 属性或可迭代对象的任何对象返回 Array 对象。

「语法」

Array.from(object, mapFunction, thisValue)
  •  object 必需。需转换为数组的对象。
  •  mapFunction 可选。对数组的每个项目调用的 map 函数。
  •  thisValue 可选。执行 mapFunction 时用作 this 的值。

总结一下,常用的大概罗列了一下,有笔误的地方帮忙指正,说到方法大家可能都知道,但是要想把他用的融会贯通,用正确,用的合适, 用的简单,还需我们在实践中多总结多尝试多探索,有问题留言,我们一起探索一起进步。