数组常用API
JS 数组常用API分类讲解
分为四大类:遍历、查找、转换、增删改、ES6新增API,附带返回值、是否改变原数组、示例、面试重点。
重点标记:原地修改数组(改变原数组) / 返回新数组(不修改原数组)
一、遍历相关
1. forEach
arr.forEach((item, index, arr)=>{})
- 作用:单纯遍历每个元素
- 返回值:
undefined - ❌不能break、continue终止循环;想中断请用for循环
- 不改变原数组
[1,2,3].forEach(item=>console.log(item))
2. map
const newArr = arr.map((item,index)=>{ return 处理后的值 })
- 作用:一一映射,每个元素执行回调,生成等长度新数组
- 返回:新数组
- 不改变原数组
const res = [1,2,3].map(x=>x*2) // [2,4,6]
3. reduce / reduceRight
刚刚讲过!
- reduce:从左向右聚合
- reduceRight:从右向左聚合
- 返回:聚合结果(数字、对象、数组都行)
二、筛选、查找(高频)
1. filter 过滤
const newArr = arr.filter(item=>条件)
- 返回:满足条件元素组成的新数组
- 不改变原数组
const arr = [10,20,30];
const res = arr.filter(x=>x>15) // [20,30]
2. find
const result = arr.find(item=>条件)
- 返回:第一个匹配的元素;找不到返回
undefined
[1,2,3].find(x=>x>1) // 2
3. findIndex
const index = arr.findIndex(item=>条件)
- 返回:第一个匹配元素下标;找不到返回
-1
4. some
const bool = arr.some(item=>条件)
- 只要至少一个满足条件 → true,找到立刻终止遍历
[1,2,3].some(x=>x>2) // true
5. every
const bool = arr.every(item=>条件)
- 所有元素都满足条件才返回true;任意一个不满足直接false
[2,4,6].every(x=>x%2===0) // true
三、ES6新增(你清单里包含)
1. includes
arr.includes(目标, [起始下标])
- 判断数组是否包含某个元素,返回布尔值
- ✅可以识别
NaN(indexOf做不到)
[1,NaN].includes(NaN) // true
[1,NaN].indexOf(NaN) // -1
2. at
arr.at(下标)
支持负数索引,负数代表倒数取值
const arr = [10,20,30]
arr.at(-1) //30 最后一项
arr.at(0) //10
四、会改变原数组的API(重点!面试高频坑)
使用这些方法,原始数组直接被修改!
- push:尾部添加元素,返回新长度
- pop:删除最后一个元素,返回被删除元素
- unshift:头部添加元素,返回新长度
- shift:删除第一个元素,返回被删除元素
- splice:删除/插入/替换元素,功能最强
arr.splice(start, 删除数量, 新增元素)
- sort:数组排序(默认按字符串排序!数字排序要传回调)
[10,2].sort((a,b)=>a-b) //升序
[10,2].sort((a,b)=>b-a) //降序
- reverse:数组反转
五、不改变原数组,返回新数组
- slice 截取片段
arr.slice(start, end) // [start, end),end取不到
arr.slice() //快速浅拷贝数组
区分:splice改原数组;slice不修改!极易混淆
- concat 数组拼接
[1,2].concat([3,4]) // [1,2,3,4]
六、数组与字符串互相转换
- join:数组 → 字符串
[1,2,3].join('-') // "1-2-3"
- split:字符串 → 数组(字符串方法)
"1,2,3".split(',') // ["1","2","3"]
一张核心区分表(必背)
| API | 返回值 | 是否修改原数组 |
|---|---|---|
| forEach | undefined | ❌ |
| map | 新数组 | ❌ |
| filter | 新数组 | ❌ |
| find | 元素/undefined | ❌ |
| some/every | boolean | ❌ |
| reduce | 聚合结果 | ❌ |
| push/pop/shift/unshift | 长度/删除元素 | ✅ |
| splice | 被删除元素组成的数组 | ✅ |
| slice | 新数组 | ❌ |
| includes | boolean | ❌ |
| at | 元素 | ❌ |
经典面试坑汇总
sort()默认按字符排序,数字排序必须传入回调函数splice改原数组,slice不修改indexOf无法判断NaN,优先用includes- forEach不能break终止循环,需要中断请使用for / for...of
测试代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>数组API</title>
</head>
<body>
<script>
const arr = [1,2,3,4];
//1.foreach undefined 不修改原数组
arr.forEach(element => {
console.log(element);
});
//2.map 新数组 不修改原数组
const arr1=arr.map(x=>x*2);
console.log(arr1);
//3.filter 新数组 ❌
const arr2=arr1.filter(x=>x>=4);
console.log(arr2);
//4.find 元素 /undefined ❌
let v=arr2.find(x=>{
return Math.cbrt(x)===2?x:undefined;
});
console.log(v);
//5.some/every boolean ❌
console.log(arr2.some(x=>x%2==0));
console.log(arr2.every(x=>(x&x-1)===0));
//6.reduce 聚合结果 ❌
let sum = arr2.reduce((a,b)=>{
a=a+b*b;
return a;
},0);
console.log(sum);//16+36+64=116
// \sumi^2=n*(n+1)*(2n+1)/6
// \sum (2i)^2=4 \sum i^2=2*n*(n+1)*(2n+1)/3
function getPreSquare(n=0){
return 2*n*(n+1)*(2*n+1)/3;
}
console.log(getPreSquare(4)-getPreSquare(1));//116,结果是一样的
//7.push/pop/shift/unshift 长度 / 删除元素 ✅
//这个会修改原数组,push是从数组尾部添加一个元素
arr2.push(10);
console.log(arr2);
arr2.pop();
console.log(arr2);
//unshift比较特别是从前面添加元素
arr2.unshift(2);
console.log(arr2);
arr2.shift();
console.log(arr2);
//8.splice 被删除元素组成的数组 ✅
//返回值是被删除元素组成的数组,格式为splice(起始下标,删除数量,删除位置替换的元素)
arr2.splice(0,1,10);
console.log(arr2);
arr2.shift();
arr2.unshift(4);
//9.slice 新数组 ❌
const arr3 = arr2.slice(0,1);
console.log(arr3);
//10.includes boolean ❌
console.log(arr3.includes(8));
//11.at
console.log(arr2.at(-1));
//12.sort
//降序
arr2.sort((a,b)=>b-a);
console.log(arr2);
//升序
arr2.sort((a,b)=>a-b);
console.log(arr2);
//13.reverse
arr2.reverse(0,arr2.length);
console.log(arr2);
//14.join,数组到字符串
let str = arr2.join('-');
console.log(str);
//15.split,字符串到数组,可以传入正则表达式用于切割
let reg=/-/;
const arr4=str.split(reg).map(a=>Number.parseInt(a));
console.log(arr4);
</script>
</body>
</html>

浙公网安备 33010602011771号