在工作中,因为我是写React的,大部分时间都是在写map,其他的数组方法很容易弄混,做一下备忘。

数组方法备忘
1188 words
... views

在写 React 的时候,用的最多的就是 map 方法。这很经典,就不再记录了。

数组方法速查表h3

维度方法列表核心提醒
修改原数组push/pop/shift/unshift/splice/sort/reverse/fill慎用!需保留原数组则先拷贝([…arr])
返回新数组slice/map/filter/concat/flat原数组不变,可链式调用(如arr.filter().map())
无返回值forEach仅遍历,不能链式调用
返回单个值find/findIndex/every/some/indexOf/includes/reduce按需选择(找元素用 find,找索引用 findIndex,累加用 reduce)

对数组的操作,有影响原数组的,也有不影响原数组的。

会修改原数组的方法h3

这类方法直接改变原数组,是新手最容易出错的点,记录时重点标注 “修改原数组”:

方法功能易错点
push()向数组末尾添加元素返回值是新数组长度,不是新数组
pop()删除数组最后一个元素返回值是被删除的元素,不是剩余数组
shift()删除数组第一个元素返回值是被删除的元素,且性能比 pop() 差(数组会重新索引)
unshift()向数组开头添加元素返回值是新数组长度,且性能差(数组重新索引)
splice(start, deleteCount, ...items)增 / 删 / 改数组元素start 为负数时从末尾计数;② 返回值是被删除的元素数组;③ 第二个参数是 “删除数量” 不是 “结束索引”
sort((a,b) => {})数组排序① 默认按字符串 Unicode 排序(数字需自定义比较函数);② 比较函数返回 a-b 升序,b-a 降序
reverse()反转数组无参数,直接反转原数组,返回反转后的数组(和原数组指向同一内存)
fill(value, start, end)填充数组start/end 可选,左闭右开,填充覆盖原数组元素

splice 用法h4

语法:array.splice(start, deleteCount, item1, item2, ...)

  • start:开始的位置下标
  • deleteCount:删除的数量
  • item1, item2, ...:要添加的元素
NOTE

① start为负数时从末尾计数; ② 返回值是被删除的元素数组; ③ 第二个参数是 “删除数量” 不是 “结束索引”


fill 用法h4

语法:array.fill(value, start, end)

  • value:要填充的值
  • start:开始的位置下标
  • end:结束的位置下标
NOTE

start/end可选,左闭右开,填充覆盖原数组元素

不会修改原数组的方法h3

这类方法返回新结果,原数组不变,易和 “修改原数组” 的方法混淆:

方法功能易错点
slice(start, end)截取数组片段① 左闭右开;② start/end 为负数从末尾计数;③ 返回新数组,原数组不变
map((item) => {})遍历并返回新数组① 必须有返回值,否则新数组全为 undefined;② 不会过滤元素(长度与原数组一致)
filter((item) => {})过滤并返回新数组返回值为 true 的元素保留,新数组长度可能小于原数组
concat(arr1, arr2)拼接数组① 可拼接多个数组或值;② 返回新数组,原数组不变(ES6 推荐使用 [...arr1, ...arr2]
flat(depth)扁平化数组depth 默认 1,Infinity 可展平任意深度;② 返回新数组,原数组不变

遍历与归并方法h3

无返回值 / 返回特定值,这类方法重点在 “遍历逻辑”,返回值易混淆:

方法功能易错点
forEach((item) => {})遍历数组① 无返回值(默认 undefined);② 无法用 break/continue 中断遍历
find((item) => {})找第一个符合条件的元素① 返回找到的元素,无则 undefined;② 找到后立即停止遍历
findIndex((item) => {})找第一个符合条件的索引① 返回索引,无则 -1;② 注意和 indexOf 的区别(indexOf 找值,findIndex 找条件)
every((item) => {})判断所有元素是否符合条件① 全满足返回 true,否则 false;② 有一个不满足立即停止遍历
some((item) => {})判断是否有元素符合条件① 有一个满足返回 true,否则 false;② 找到后立即停止遍历
reduce((acc, cur) => {}, init)累加 / 归并数组acc 是累计值,cur 是当前元素;② 无初始值时,acc 默认第一个元素,cur 从第二个开始(易出错)

reduce 用法h4

语法:array.reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)

  • callback:回调函数,接收四个参数:
    • accumulator:累计值
    • currentValue:当前元素
    • currentIndex:当前索引
    • array:原数组
  • initialValue:初始值(可选)

查找与判断方法h3

方法功能易错点
indexOf(value, start)找元素首次出现的索引① 返回索引,无则-1;② 无法查找NaN([NaN].indexOf(NaN) → -1)
includes(value, start)判断数组是否包含元素① 返回布尔值;② 能识别NaN([NaN].includes(NaN) → true)
lastIndexOf(value)找元素最后出现的索引① 从后往前找,返回索引,无则-1;② 无法查找NaN([NaN].indexOf(NaN) → -1)

评论