Appearance
数组
数组是 JavaScript 中用于存储有序数据集合的数据类型。
创建数组
数组字面量
javascript
const arr1 = [1, 2, 3, 4, 5];
const arr2 = ['a', 'b', 'c'];
const arr3 = [1, 'hello', true, { name: '张三' }];Array 构造函数
javascript
const arr1 = new Array(3); // [empty × 3]
const arr2 = new Array(1, 2, 3); // [1, 2, 3]
const arr3 = Array.of(1, 2, 3); // [1, 2, 3]
const arr4 = Array.from('hello'); // ['h', 'e', 'l', 'l', 'o']Array.from()
javascript
// 从字符串创建
Array.from('hello'); // ['h', 'e', 'l', 'l', 'o']
// 从 Set 创建
Array.from(new Set([1, 2, 2, 3])); // [1, 2, 3]
// 从 Map 创建
Array.from(new Map([[1, 'a'], [2, 'b']])); // [[1, 'a'], [2, 'b']]
// 使用 map 函数
Array.from([1, 2, 3], x => x * 2); // [2, 4, 6]
// 创建序列
Array.from({ length: 5 }, (_, i) => i); // [0, 1, 2, 3, 4]访问元素
javascript
const arr = ['a', 'b', 'c', 'd', 'e'];
console.log(arr[0]); // 'a'
console.log(arr[2]); // 'c'
console.log(arr[-1]); // undefined(不支持负索引)
console.log(arr.at(-1)); // 'e'(ES2022)
console.log(arr.length); // 5修改数组
添加元素
javascript
const arr = [1, 2, 3];
// 末尾添加
arr.push(4); // 返回新长度 4
console.log(arr); // [1, 2, 3, 4]
// 开头添加
arr.unshift(0); // 返回新长度 5
console.log(arr); // [0, 1, 2, 3, 4]
// 指定位置添加
arr.splice(2, 0, 'a');
console.log(arr); // [0, 1, 'a', 2, 3, 4]删除元素
javascript
const arr = [1, 2, 3, 4, 5];
// 末尾删除
arr.pop(); // 返回 5
console.log(arr); // [1, 2, 3, 4]
// 开头删除
arr.shift(); // 返回 1
console.log(arr); // [2, 3, 4]
// 指定位置删除
arr.splice(1, 1); // 返回 [3]
console.log(arr); // [2, 4]splice()
javascript
const arr = [1, 2, 3, 4, 5];
// 删除元素
arr.splice(2, 1); // 从索引2开始删除1个
console.log(arr); // [1, 2, 4, 5]
// 替换元素
arr.splice(1, 1, 'a', 'b');
console.log(arr); // [1, 'a', 'b', 4, 5]
// 插入元素
arr.splice(2, 0, 'x');
console.log(arr); // [1, 'a', 'x', 'b', 4, 5]遍历数组
for 循环
javascript
const arr = [1, 2, 3, 4, 5];
// 传统 for 循环
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
// for...of
for (const item of arr) {
console.log(item);
}
// for...of 获取索引
for (const [index, item] of arr.entries()) {
console.log(index, item);
}forEach()
javascript
const arr = [1, 2, 3, 4, 5];
arr.forEach((item, index, array) => {
console.log(index, item);
});数组方法
查找元素
javascript
const arr = [1, 2, 3, 4, 5, 3];
// indexOf - 查找元素索引
arr.indexOf(3); // 2
arr.indexOf(6); // -1
arr.lastIndexOf(3); // 5
// includes - 是否包含
arr.includes(3); // true
arr.includes(6); // false
// find - 查找元素
arr.find(x => x > 3); // 4
// findIndex - 查找索引
arr.findIndex(x => x > 3); // 3
// findLast / findLastIndex(ES2023)
arr.findLast(x => x > 3); // 5
arr.findLastIndex(x => x > 3); // 5过滤和映射
javascript
const arr = [1, 2, 3, 4, 5];
// filter - 过滤
const evens = arr.filter(x => x % 2 === 0);
console.log(evens); // [2, 4]
// map - 映射
const doubled = arr.map(x => x * 2);
console.log(doubled); // [2, 4, 6, 8, 10]
// flatMap - 映射后扁平化
const nested = [[1, 2], [3, 4]];
const flat = nested.flatMap(x => x);
console.log(flat); // [1, 2, 3, 4]归约
javascript
const arr = [1, 2, 3, 4, 5];
// reduce - 归约
const sum = arr.reduce((acc, x) => acc + x, 0);
console.log(sum); // 15
// reduceRight - 从右向左归约
const str = ['a', 'b', 'c'].reduceRight((acc, x) => acc + x, '');
console.log(str); // 'cba'判断方法
javascript
const arr = [1, 2, 3, 4, 5];
// every - 全部满足
arr.every(x => x > 0); // true
arr.every(x => x > 3); // false
// some - 存在满足
arr.some(x => x > 3); // true
arr.some(x => x > 10); // false排序
javascript
const arr = [3, 1, 4, 1, 5, 9, 2, 6];
// sort - 排序(原地修改)
arr.sort((a, b) => a - b); // 升序
console.log(arr); // [1, 1, 2, 3, 4, 5, 6, 9]
arr.sort((a, b) => b - a); // 降序
console.log(arr); // [9, 6, 5, 4, 3, 2, 1, 1]
// reverse - 反转
arr.reverse();
console.log(arr); // [1, 1, 2, 3, 4, 5, 6, 9]
// toSorted / toReversed(ES2023)- 不修改原数组
const sorted = arr.toSorted((a, b) => a - b);截取和合并
javascript
const arr = [1, 2, 3, 4, 5];
// slice - 截取(不修改原数组)
arr.slice(1, 4); // [2, 3, 4]
arr.slice(2); // [3, 4, 5]
arr.slice(-2); // [4, 5]
// concat - 合并
const arr1 = [1, 2];
const arr2 = [3, 4];
const merged = arr1.concat(arr2);
console.log(merged); // [1, 2, 3, 4]
// 展开运算符
const merged2 = [...arr1, ...arr2];填充
javascript
const arr = [1, 2, 3, 4, 5];
// fill - 填充
arr.fill(0, 1, 3);
console.log(arr); // [1, 0, 0, 4, 5]
// copyWithin - 内部复制
[1, 2, 3, 4, 5].copyWithin(0, 3, 5);
// [4, 5, 3, 4, 5]转换
javascript
const arr = [1, 2, 3];
// join - 转字符串
arr.join(); // '1,2,3'
arr.join('-'); // '1-2-3'
arr.join(''); // '123'
// toString
arr.toString(); // '1,2,3'
// Array.isArray - 判断数组
Array.isArray(arr); // true
Array.isArray({}); // false扁平化
javascript
const nested = [1, [2, 3], [4, [5, 6]]];
// flat - 扁平化
nested.flat(); // [1, 2, 3, 4, [5, 6]]
nested.flat(2); // [1, 2, 3, 4, 5, 6]
nested.flat(Infinity); // 完全扁平化解构赋值
javascript
const arr = [1, 2, 3, 4, 5];
// 基本解构
const [a, b, c] = arr;
console.log(a, b, c); // 1 2 3
// 跳过元素
const [first, , third] = arr;
console.log(first, third); // 1 3
// 剩余元素
const [head, ...tail] = arr;
console.log(head); // 1
console.log(tail); // [2, 3, 4, 5]
// 默认值
const [x, y, z, w = 10] = [1, 2, 3];
console.log(w); // 10扩展运算符
javascript
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
// 合并数组
const merged = [...arr1, ...arr2];
console.log(merged); // [1, 2, 3, 4, 5, 6]
// 复制数组
const copy = [...arr1];
// 转换参数
const nums = [1, 5, 3];
Math.max(...nums); // 5实践示例
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>JavaScript 数组示例</title>
</head>
<body>
<h1>JavaScript 数组示例</h1>
<script>
// 数组工具函数
const ArrayUtils = {
// 去重
unique(arr) {
return [...new Set(arr)];
},
// 分组
groupBy(arr, key) {
return arr.reduce((groups, item) => {
const group = typeof key === 'function' ? key(item) : item[key];
groups[group] = groups[group] || [];
groups[group].push(item);
return groups;
}, {});
},
// 分块
chunk(arr, size) {
return Array.from({ length: Math.ceil(arr.length / size) }, (_, i) =>
arr.slice(i * size, i * size + size)
);
},
// 扁平化
flatten(arr, depth = Infinity) {
return arr.flat(depth);
},
// 交集
intersection(arr1, arr2) {
const set = new Set(arr2);
return arr1.filter(x => set.has(x));
},
// 差集
difference(arr1, arr2) {
const set = new Set(arr2);
return arr1.filter(x => !set.has(x));
},
// 并集
union(arr1, arr2) {
return [...new Set([...arr1, ...arr2])];
},
// 统计频率
frequency(arr) {
return arr.reduce((freq, item) => {
freq[item] = (freq[item] || 0) + 1;
return freq;
}, {});
},
// 随机打乱
shuffle(arr) {
const result = [...arr];
for (let i = result.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[result[i], result[j]] = [result[j], result[i]];
}
return result;
}
};
// 测试
const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
console.log('去重:', ArrayUtils.unique(numbers));
console.log('频率:', ArrayUtils.frequency(numbers));
const users = [
{ name: '张三', age: 25, city: '北京' },
{ name: '李四', age: 30, city: '上海' },
{ name: '王五', age: 25, city: '北京' }
];
console.log('按年龄分组:', ArrayUtils.groupBy(users, 'age'));
console.log('分块:', ArrayUtils.chunk([1, 2, 3, 4, 5, 6, 7], 3));
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5, 6];
console.log('交集:', ArrayUtils.intersection(arr1, arr2));
console.log('差集:', ArrayUtils.difference(arr1, arr2));
console.log('并集:', ArrayUtils.union(arr1, arr2));
console.log('随机打乱:', ArrayUtils.shuffle([1, 2, 3, 4, 5]));
</script>
</body>
</html>