在JavaScript中,操作JSON数组(实际上是JavaScript对象数组)有多种方法。这里列举一些常用的数组操作方法,并简要说明它们的用途和用法。
1. push()
- 用途:向数组末尾添加一个或多个元素,并返回新的长度。
- 示例:
let arr = [{name: "Alice"}, {name: "Bob"}]; arr.push({name: "Charlie"}); console.log(arr); // 输出: [{name: "Alice"}, {name: "Bob"}, {name: "Charlie"}]
2. pop()
- 用途:删除数组的最后一个元素,并返回该元素。
- 示例:
let arr = [{name: "Alice"}, {name: "Bob"}]; let last = arr.pop(); console.log(last); // 输出: {name: "Bob"} console.log(arr); // 输出: [{name: "Alice"}]
3. shift()
- 用途:删除数组的第一个元素,并返回该元素。
- 示例:
let arr = [{name: "Alice"}, {name: "Bob"}]; let first = arr.shift(); console.log(first); // 输出: {name: "Alice"} console.log(arr); // 输出: [{name: "Bob"}]
4. unshift()
- 用途:向数组的开头添加一个或多个元素,并返回新的长度。
- 示例:
let arr = [{name: "Alice"}, {name: "Bob"}]; arr.unshift({name: "Charlie"}); console.log(arr); // 输出: [{name: "Charlie"}, {name: "Alice"}, {name: "Bob"}]
5. splice()
- 用途:可以用来添加/删除数组中的元素。
- 参数:第一个参数是开始位置,第二个参数是要移除的数量,后续参数是要添加的新元素。
- 示例:
let arr = [{name: "Alice"}, {name: "Bob"}, {name: "Charlie"}]; arr.splice(1, 1, {name: "David"}); // 从索引1开始,删除1个元素,然后插入{name: "David"} console.log(arr); // 输出: [{name: "Alice"}, {name: "David"}, {name: "Charlie"}]
6. map()
- 用途:创建一个新数组,其结果是调用提供的函数处理原数组的每个元素的结果。
- 示例:
let arr = [{name: "Alice", age: 30}, {name: "Bob", age: 25}]; let ages = arr.map(item => item.age); console.log(ages); // 输出: [30, 25]
7. filter()
- 用途:创建一个新数组,包含通过测试的所有元素。
- 示例:
let arr = [{name: "Alice", age: 30}, {name: "Bob", age: 25}, {name: "Charlie", age: 35}]; let adults = arr.filter(item => item.age >= 30); console.log(adults); // 输出: [{name: "Alice", age: 30}, {name: "Charlie", age: 35}]
8. find()
- 用途:返回数组中满足提供的测试函数的第一个元素的值。否则返回
undefined
。 - 示例:
let arr = [{name: "Alice", age: 30}, {name: "Bob", age: 25}, {name: "Charlie", age: 35}]; let person = arr.find(item => item.name === "Bob"); console.log(person); // 输出: {name: "Bob", age: 25}
9. forEach()
- 用途:对数组的每个元素执行一次提供的函数。
- 示例:
let arr = [{name: "Alice"}, {name: "Bob"}]; arr.forEach(item => console.log(item.name)); // 输出: // Alice // Bob
当然,随着JavaScript的发展,ES6及更高版本引入了一些新的数组操作方法,这些方法使得处理数组变得更加方便和强大。下面是一些新增加的方法:
10. Array.from()
- 用途:从类数组对象或可迭代对象中创建一个新的数组实例。
- 示例:
let arrayLike = {0: 'a', 1: 'b', 2: 'c', length: 3}; let arr = Array.from(arrayLike); console.log(arr); // 输出: ['a', 'b', 'c']
11. Array.of()
- 用途:创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
- 示例:
let arr = Array.of(1, 2, 3); console.log(arr); // 输出: [1, 2, 3]
12. includes()
- 用途:判断数组是否包含某个指定的值,如果存在则返回
true
,否则返回false
。 - 示例:
let arr = [1, 2, 3]; console.log(arr.includes(2)); // 输出: true
13. entries()
- 用途:返回一个新的数组迭代器对象,该对象包含了数组中每个索引的键值对。
- 示例:
let arr = ['a', 'b', 'c']; for (let entry of arr.entries()) {console.log(entry); } // 输出: // [0, 'a'] // [1, 'b'] // [2, 'c']
14. keys()
- 用途:返回一个新的数组迭代器对象,该对象包含了数组中每个索引的键。
- 示例:
let arr = ['a', 'b', 'c']; for (let key of arr.keys()) {console.log(key); } // 输出: // 0 // 1 // 2
15. values()
- 用途:返回一个新的数组迭代器对象,该对象包含了数组中每个索引的值。
- 示例:
let arr = ['a', 'b', 'c']; for (let value of arr.values()) {console.log(value); } // 输出: // 'a' // 'b' // 'c'
16. flat()
- 用途:将数组的子数组结构展平,返回一个新数组。
- 示例:
let arr = [1, [2, [3, [4]]]]; console.log(arr.flat(Infinity)); // 输出: [1, 2, 3, 4]
17. flatMap()
- 用途:首先使用映射函数映射每个元素,然后将结果展平一级深度,最后返回结果。
- 示例:
let arr = [1, 2, 3, 4]; console.log(arr.flatMap(x => [x * 2])); // 输出: [2, 4, 6, 8]
·8. at()
- 用途:返回数组中指定位置的元素,支持负数索引。
- 示例:
let arr = [1, 2, 3, 4]; console.log(arr.at(-1)); // 输出: 4
当然,随着ECMAScript标准的不断演进,更高版本的JavaScript引入了更多有用的数组操作方法。以下是ES10(ES2019)及更高版本中的一些新增方法:
19. Array.prototype.flat()
- 用途:将嵌套的数组“拉平”,返回一个新数组。
- 参数:可选参数,表示要递归展平的层数,默认为1。
- 示例:
let arr = [1, [2, [3, [4]]]]; console.log(arr.flat(Infinity)); // 输出: [1, 2, 3, 4]
20. Array.prototype.flatMap()
- 用途:先对数组中的每个元素进行映射,然后再将结果展平一层。
- 示例:
let arr = [1, 2, 3, 4]; console.log(arr.flatMap(x => [x * 2])); // 输出: [2, 4, 6, 8]
21. Array.prototype.at()
- 用途:返回数组中指定位置的元素,支持负数索引。
- 示例:
let arr = [1, 2, 3, 4]; console.log(arr.at(-1)); // 输出: 4
22. Array.prototype.toString()
- 用途:将数组转换为字符串,每个元素之间用逗号分隔。
- 示例:
let arr = [1, 2, 3, 4]; console.log(arr.toString()); // 输出: "1,2,3,4"
23. Array.prototype.toLocaleString()
- 用途:将数组转换为本地化的字符串,每个元素之间用逗号分隔。
- 示例:
let arr = [1, 2, 3, 4]; console.log(arr.toLocaleString()); // 输出: "1,2,3,4" (根据本地化设置可能不同)
24. Array.prototype.copyWithin()
- 用途:将数组的一部分复制到同一数组中的另一个位置,并返回它,不会改变原数组的长度。
- 参数:目标起始位置、源起始位置、源结束位置(可选)。
- 示例:
let arr = [1, 2, 3, 4, 5]; console.log(arr.copyWithin(0, 3, 4)); // 输出: [4, 2, 3, 4, 5]
25. Array.prototype.fill()
- 用途:用一个固定值填充一个数组中从起始索引到终止索引内的全部元素。
- 参数:填充的值、起始索引(可选)、终止索引(可选)。
- 示例:
let arr = [1, 2, 3, 4, 5]; console.log(arr.fill(0, 2, 4)); // 输出: [1, 2, 0, 0, 5]
26. Array.from()
- 用途:从类数组对象或可迭代对象中创建一个新的数组实例。
- 示例:
let arrayLike = {0: 'a', 1: 'b', 2: 'c', length: 3}; let arr = Array.from(arrayLike); console.log(arr); // 输出: ['a', 'b', 'c']
27. Array.of()
- 用途:创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
- 示例:
let arr = Array.of(1, 2, 3); console.log(arr); // 输出: [1, 2, 3]
28. Array.prototype.some()
- 用途:测试数组中是否有至少一个元素通过提供的函数测试。
- 示例:
let arr = [1, 2, 3, 4, 5]; console.log(arr.some(x => x > 3)); // 输出: true
29. Array.prototype.every()
- 用途:测试数组中所有元素是否都通过提供的函数测试。
- 示例:
let arr = [1, 2, 3, 4, 5]; console.log(arr.every(x => x > 0)); // 输出: true
30. Array.prototype.reduce()
- 用途:对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
- 示例:
let arr = [1, 2, 3, 4]; let sum = arr.reduce((acc, curr) => acc + curr, 0); console.log(sum); // 输出: 10
31. Array.prototype.reduceRight()
- 用途:与
reduce()
类似,但它是从右到左执行。 - 示例:
let arr = [1, 2, 3, 4]; let sum = arr.reduceRight((acc, curr) => acc + curr, 0); console.log(sum); // 输出: 10
32. Array.prototype.sort()
- 用途:对数组的元素进行排序。
- 参数:可选的比较函数。
- 示例:
let arr = [1, 3, 2, 5, 4]; arr.sort((a, b) => a - b); console.log(arr); // 输出: [1, 2, 3, 4, 5]
33. Array.prototype.reverse()
- 用途:将数组中的元素顺序反转。
- 示例:
let arr = [1, 2, 3, 4, 5]; arr.reverse(); console.log(arr); // 输出: [5, 4, 3, 2, 1]
34. Array.prototype.concat()
- 用途:用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
- 示例:
let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; let combined = arr1.concat(arr2); console.log(combined); // 输出: [1, 2, 3, 4, 5, 6]
35. Array.prototype.slice()
- 用途:提取原数组的一部分,返回一个新数组,不修改原数组。
- 参数:开始索引(可选)、结束索引(可选)。
- 示例:
let arr = [1, 2, 3, 4, 5]; let slice = arr.slice(1, 3); console.log(slice); // 输出: [2, 3]
36. Array.prototype.splice()
- 用途:可以在数组中添加/删除项目,然后返回被删除的项目。
- 参数:开始索引、删除的元素个数、插入的元素(可选)。
- 示例:
let arr = [1, 2, 3, 4, 5]; let removed = arr.splice(1, 2, 'a', 'b'); console.log(arr); // 输出: [1, 'a', 'b', 4, 5] console.log(removed); // 输出: [2, 3]
37. Array.prototype.indexOf()
- 用途:返回数组中第一个匹配指定值的元素的索引,如果没有找到则返回-1。
- 示例:
let arr = [1, 2, 3, 4, 5]; console.log(arr.indexOf(3)); // 输出: 2
38. Array.prototype.lastIndexOf()
- 用途:返回数组中最后一个匹配指定值的元素的索引,如果没有找到则返回-1。
- 示例:
let arr = [1, 2, 3, 2, 5]; console.log(arr.lastIndexOf(2)); // 输出: 3
39. Array.prototype.join()
- 用途:将数组的所有元素连接成一个字符串并返回这个字符串。
- 参数:元素之间的分隔符(可选)。
- 示例:
let arr = [1, 2, 3, 4, 5]; console.log(arr.join('-')); // 输出: "1-2-3-4-5"
40. Array.prototype.includes()
- 用途:判断数组是否包含某个指定的值,如果存在则返回
true
,否则返回false
。 - 示例:
let arr = [1, 2, 3, 4, 5]; console.log(arr.includes(3)); // 输出: true
41. Array.prototype.entries()
- 用途:返回一个新的数组迭代器对象,该对象包含了数组中每个索引的键值对。
- 示例:
let arr = [1, 2, 3]; for (let [index, value] of arr.entries()) {console.log(index, value); } // 输出: // 0 1 // 1 2 // 2 3
42. Array.prototype.keys()
- 用途:返回一个新的数组迭代器对象,该对象包含了数组中每个索引的键。
- 示例:
let arr = [1, 2, 3]; for (let key of arr.keys()) {console.log(key); } // 输出: // 0 // 1 // 2
43. Array.prototype.values()
- 用途:返回一个新的数组迭代器对象,该对象包含了数组中每个索引的值。
- 示例:
let arr = [1, 2, 3]; for (let value of arr.values()) {console.log(value); } // 输出: // 1 // 2 // 3
44. Array.prototype.at()
- 用途:返回数组中指定位置的元素,支持负数索引。
- 示例:
let arr = [1, 2, 3, 4]; console.log(arr.at(-1)); // 输出: 4