JavaScript Array [](一文讲透)

JavaScript Array []:快速掌握数组操作技巧

JavaScript Array [] 是前端开发中使用最频繁的数据结构之一,用于存储和操作一组数据。无论是处理用户输入、渲染列表,还是操作 DOM 元素,Array [] 都扮演着重要角色。本文将系统讲解 JavaScript Array 的创建、常用方法、进阶用法和实际应用,帮助你高效应对开发中的各种场景。

创建数组与初始化

JavaScript 中创建数组有多种方式,最常见的有以下几种:

使用数组字面量

// 使用数组字面量创建一个空数组
const arr1 = [];
// 创建并初始化一个包含多个元素的数组
const arr2 = [1, 2, 3, 4, 5];

使用 Array 构造函数

// 使用构造函数创建一个空数组
const arr3 = new Array();
// 创建一个指定长度的数组(注意:不会填充内容)
const arr4 = new Array(5); // 长度为 5,内容为 [empty × 5]
// 创建并初始化数组
const arr5 = new Array(1, 2, 3); // 等价于 [1, 2, 3]

从其他数据类型转换

// 将字符串转换为数组
const str = "hello";
const arr6 = Array.from(str); // ["h", "e", "l", "l", "o"]

常用方法

以下是 JavaScript Array 最常用的方法,按使用频率排序:

方法名 用途说明 是否改变原数组 示例
push() 向数组末尾添加一个或多个元素 arr.push(6)
pop() 删除数组最后一个元素并返回它 arr.pop()
shift() 删除数组第一个元素并返回它 arr.shift()
unshift() 向数组开头添加一个或多个元素 arr.unshift(0)
slice() 返回数组的一部分(不修改原数组) arr.slice(1, 3)
splice() 删除或添加数组元素(会修改原数组) arr.splice(2, 1, 99)
map() 遍历数组并返回新数组 arr.map(x => x * 2)
filter() 筛选符合条件的元素 arr.filter(x => x > 2)
find() 返回符合条件的第一个元素 arr.find(x => x === 3)
sort() 对数组元素进行排序 arr.sort((a, b) => a - b)
reduce() 将数组元素“归一”为一个值 arr.reduce((a, b) => a + b)

常用方法详解

push() 与 pop()

let numbers = [1, 2, 3];
numbers.push(4); // 添加元素到数组末尾
console.log(numbers); // [1, 2, 3, 4]

let last = numbers.pop(); // 删除并返回最后一个元素
console.log(last); // 4
console.log(numbers); // [1, 2, 3]

map() 与 filter()

// map() 将每个元素乘以 2
let nums = [1, 2, 3, 4];
let doubled = nums.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8]

// filter() 筛选出偶数
let evens = nums.filter(num => num % 2 === 0);
console.log(evens); // [2, 4]

splice()

let colors = ["red", "green", "blue", "yellow"];
let removed = colors.splice(1, 2, "orange", "pink"); 
// 从索引 1 开始删除 2 个元素,插入 "orange" 和 "pink"
console.log(colors); // ["red", "orange", "pink", "yellow"]
console.log(removed); // ["green", "blue"]

高级技巧

扁平化嵌套数组

// 使用 reduce + concat 实现数组扁平化
let nested = [1, [2, [3, 4], 5]];
let flat = nested.reduce((acc, val) => 
    Array.isArray(val) ? acc.concat(val) : acc.concat(val), []);
console.log(flat); // [1, 2, 3, 4, 5]

合并多个数组

let a = [1, 2];
let b = [3, 4];
let c = [5, 6];
let combined = [].concat(a, b, c); 
// 合并多个数组为一个数组
console.log(combined); // [1, 2, 3, 4, 5, 6]

遍历对象并转换为数组

const obj = { a: 1, b: 2, c: 3 };
const keys = Object.keys(obj); // ["a", "b", "c"]
const values = Object.values(obj); // [1, 2, 3]
const entries = Object.entries(obj); // [["a", 1], ["b", 2], ["c", 3]]

常见问题

为什么 new Array(5) 返回的是 [empty × 5] 而不是 [5]

new Array(5) 会创建一个长度为 5 的空数组,但没有填充元素,此时数组中每个位置都是空的,而不是 5。如果传入多个参数,则创建一个包含这些参数的数组,如 new Array(1, 2, 3) 会返回 [1, 2, 3]

slice()splice() 有什么区别?

slice() 用于返回数组的一个子集,不会修改原数组;而 splice() 会修改原数组,用于删除或添加元素。例如:

let arr = [1, 2, 3, 4];
console.log(arr.slice(1, 3)); // [2, 3],不改变原数组
console.log(arr); // [1, 2, 3, 4]

let removed = arr.splice(1, 2); // 删除索引1开始的两个元素
console.log(arr); // [1, 4]
console.log(removed); // [2, 3]

如何判断一个变量是否是数组?

使用 Array.isArray() 方法进行判断:

let arr = [1, 2, 3];
let notArr = "string";
console.log(Array.isArray(arr)); // true
console.log(Array.isArray(notArr)); // false

实战应用

实现一个购物车总价计算

const cart = [
    { name: "苹果", price: 3, quantity: 2 },
    { name: "香蕉", price: 2, quantity: 3 },
    { name: "橙子", price: 5, quantity: 1 }
];

const total = cart.reduce((sum, item) => {
    return sum + item.price * item.quantity; // 累加价格乘以数量
}, 0);

console.log(`购物车总价为:${total} 元`);
// 输出:购物车总价为:14 元

动态渲染 DOM 列表

const fruits = ["苹果", "香蕉", "橙子"];
const list = document.getElementById("fruitList");

fruits.forEach(fruit => {
    const li = document.createElement("li"); // 创建 li 元素
    li.textContent = fruit; // 设置文本内容
    list.appendChild(li); // 添加到 ul 中
});

总结

JavaScript Array [] 是处理数据集合的核心工具,掌握其基本操作和高级技巧能显著提升开发效率。