js中常用的数组操作

本文按「增删改 → 遍历 → 转换 → 排序反转 → 其他常用」五类,整理 JavaScript 数组的常用方法。表中统一标注:作用、返回值、是否改变原数组(原数组被修改记「是」,返回新数组记「否」)。

1. 数组增删改

1.1 添加元素

方法作用返回值是否改变原数组
push()在数组末尾添加元素新数组长度是
unshift()在数组开头添加元素新数组长度是
concat()合并数组,返回新数组新数组否
splice()在指定位置插入/删除元素被删除的元素数组是
js
12345678910
const arr = [1, 2, 3];

arr.push(4);        // 返回 4,arr 变为 [1, 2, 3, 4]
arr.unshift(0);     // 返回 5,arr 变为 [0, 1, 2, 3, 4]

const merged = arr.concat([5, 6]);
// merged: [0, 1, 2, 3, 4, 5, 6],arr 不变

// 从索引 1 开始删除 0 个元素,插入 9
arr.splice(1, 0, 9); // 返回 [],arr 变为 [0, 9, 1, 2, 3, 4]

1.2 删除元素

方法作用返回值是否改变原数组
pop()删除最后一个元素被删除的元素是
shift()删除第一个元素被删除的元素是
splice()删除指定位置元素被删除的元素数组是
filter()过滤符合条件的元素新数组否
js
1234567
const arr = [1, 2, 3, 4, 5];

arr.pop();          // 返回 5,arr 变为 [1, 2, 3, 4]
arr.shift();        // 返回 1,arr 变为 [2, 3, 4]

const kept = arr.filter((x) => x > 2);
// kept: [3, 4],arr 不变

1.3 修改元素

方法作用返回值是否改变原数组
splice()替换指定位置元素被删除的元素数组是
直接索引赋值arr[i] = 值修改后的值是
js
12345
const arr = [1, 2, 3, 4, 5];

arr[0] = 99;          // arr 变为 [99, 2, 3, 4, 5]

arr.splice(1, 2, 100); // 返回 [2, 3],arr 变为 [99, 100, 4, 5]

2. 数组遍历

方法作用返回值是否改变原数组
forEach()遍历数组undefined否
map()映射新数组新数组否
filter()过滤数组新数组否
find()查找第一个匹配项元素或 undefined否
findIndex()查找第一个匹配项的索引索引或 -1否
some()检查是否至少有一个满足条件boolean否
every()检查是否所有元素满足条件boolean否
js
1234567891011121314
const arr = [1, 2, 3, 4, 5];

arr.forEach((x) => console.log(x)); // 依次打印 1 2 3 4 5

const doubled = arr.map((x) => x * 2);
// doubled: [2, 4, 6, 8, 10]

const evens = arr.filter((x) => x % 2 === 0);
// evens: [2, 4]

const firstEven = arr.find((x) => x % 2 === 0);      // 2
const firstEvenIdx = arr.findIndex((x) => x % 2 === 0); // 1
const hasEven = arr.some((x) => x % 2 === 0);        // true
const allEven = arr.every((x) => x % 2 === 0);       // false

3. 数组转换

方法作用返回值是否改变原数组
join()数组转字符串string否
toString()数组转字符串(逗号分隔)string否
Array.from()类数组转数组新数组否
flat()数组扁平化新数组否
flatMap()先 map() 再 flat(1)新数组否
js
123456789101112
const arr = [1, 2, 3];

arr.join("-");      // "1-2-3"
arr.toString();     // "1,2,3"

Array.from("abc"); // ["a", "b", "c"]

const nested = [1, [2, 3], 4];
nested.flat();      // [1, 2, 3, 4]

const mapped = arr.flatMap((x) => [x, x * 2]);
// [1, 2, 2, 4, 3, 6]

4. 数组排序 & 反转

方法作用返回值是否改变原数组
sort()排序(默认按 Unicode)排序后的数组是
reverse()反转数组反转后的数组是
js
1234567
const arr = [3, 1, 4, 2];

arr.sort();         // 默认按字符串比较
// arr: [1, 2, 3, 4]

arr.sort((a, b) => a - b); // 数字升序
arr.reverse();      // arr: [4, 3, 2, 1]

注意:sort() 默认把元素转成字符串按 Unicode 比较,所以 [10, 2, 1].sort() 的结果是 [1, 10, 2]。数字排序务必传入比较函数。

5. 其他常用方法

方法作用返回值是否改变原数组
slice()截取子数组新数组否
includes()检查是否包含某元素boolean否
indexOf()查找元素索引(严格相等)索引或 -1否
reduce()从左向右累积计算计算结果否
reduceRight()从右向左累积计算计算结果否
js
12345678
const arr = [1, 2, 3, 4, 5];

arr.slice(1, 3);      // [2, 3],arr 不变
arr.includes(3);      // true
arr.indexOf(3);       // 2

const sum = arr.reduce((acc, cur) => acc + cur, 0);       // 15
const sumFromRight = arr.reduceRight((acc, cur) => acc + cur, 0); // 15