大家好,我是行者酒不离手,在日常开发中,经常要处理数据,数组是比较常见的类型,有的时候不知道一些细节,经常需要去查阅一些数组方法,费时费力。同时作为一个合格的前端程序员的基本要求,也需要熟练掌握用法,并能够敏锐的察觉出在何种场景下使用哪种方法处理最优 ,下面我整理了一下,希望能对你有用。
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 有两个参数,一个是回调函数,一个是初始值。
它有两种取值情况:
-
当提供了
initialValue初始值时, 那么accumulator的值为initialValue,currentValue的值为数组第一个值 -
当没有提供
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将对象引用复制到新数组中。原始数组和新数组都引用相同的对象。也就是说,如果引用的对象被修改,则更改对于新数组和原始数组都是可见的。这包括也是数组的数组参数的元素。 -
数据类型如字符串,数字和布尔(不是
String,Number和Boolean) 对象):concat将字符串和数字的值复制到新数组中。
-
toString()
toString() 返回一个字符串,表示指定的数组及其元素。
「当一个数组被作为文本值或者进行字符串连接操作时,将会自动调用其 toString 方法。」
对于数组对象,toString 方法连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素。
「语法」
arr.toString()
join()
join()方法通过连接数组元素用逗号或指定的分隔符字符串分隔,返回一个字符串。
如果数组只有一项,则将在不使用分隔符的情况下返回该项。
「语法」
join()join(separator)
separator: 指定的分割的 字符 可选
slice()
slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的**「浅拷贝」**(包括 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 的值。
总结一下,常用的大概罗列了一下,有笔误的地方帮忙指正,说到方法大家可能都知道,但是要想把他用的融会贯通,用正确,用的合适, 用的简单,还需我们在实践中多总结多尝试多探索,有问题留言,我们一起探索一起进步。