数组是 JavaScript 中最常用的数据结构,ES6 之后数组方法越来越丰富。按「是否改变原数组」分类整理,方便查阅和选择。
1. 不改变原数组:map、filter、find 等
const nums = [1, 2, 3, 4, 5];
// map:每项加工后返回新数组
const doubled = nums.map(n => n * 2); // [2, 4, 6, 8, 10]
// filter:筛出满足条件的项
const evens = nums.filter(n => n % 2 === 0); // [2, 4]
// find / findIndex:找第一个满足条件的项
const found = nums.find(n => n > 3); // 4
// some / every:是否存在 / 是否全部满足
nums.some(n => n > 4); // true
nums.every(n => n > 0); // true
// reduce:聚合为一个值
const total = nums.reduce((sum, n) => sum + n, 0); // 15
// slice:截取片段(不修改原数组)
nums.slice(1, 3); // [2, 3]
2. 改变原数组:push、splice、sort 等
const arr = [3, 1, 4, 1, 5];
// 尾部增删
arr.push(9); // 返回新长度,数组变为 [3,1,4,1,5,9]
arr.pop(); // 弹出 9
// 头部增删
arr.unshift(0); // 头部插入
arr.shift(); // 弹出头元素
// splice:任意位置的增删改(返回被删除元素)
arr.splice(1, 2, 7, 8); // 从下标1删2个,再插入 7,8
// sort 就地排序,默认按字符串比较!
[10, 2, 33].sort(); // [10, 2, 33],错误排序
[10, 2, 33].sort((a, b) => a - b); // [2, 10, 33],正确
arr.sort((a, b) => b - a); // 降序
sort 和 splice 都会修改原数组,处理需要保留原始数据的场景时,先 slice 或用 toSorted、toSpliced(ES2023 新方法)。
3. 遍历方式对比
const list = ["a", "b", "c"];
// for...of:遍历值(推荐用于可迭代对象)
for (const item of list) console.log(item);
// forEach:简洁,但不能 break/continue
list.forEach((item, index) => console.log(index, item));
// for...in:遍历下标(键),数组不建议使用
for (const key in list) console.log(key); // "0" "1" "2"
4. 扁平化与查找
// flat:拍平嵌套数组
[1, [2, [3, [4]]]].flat(2); // [1, 2, 3, [4]]
[1, [2, [3, [4]]]].flat(Infinity); // [1, 2, 3, 4]
// includes:判断是否包含
[1, 2, 3].includes(2); // true
// indexOf:查找下标,不存在返回 -1
["a", "b"].indexOf("b"); // 1
// join / split:数组与字符串互转
"a,b,c".split(","); // ["a", "b", "c"]
["a", "b"].join("-"); // "a-b"
5. 常见陷阱
最常踩的三个坑:一是 sort 默认按字符串排序,数字必须传比较函数;二是 forEach 无法用 break 中断,需要中断就改用 for…of 或 some/every 配合 return true;三是 NaN 的判断,indexOf 找不到 NaN,includes 可以。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








暂无评论内容