数组
一、什么是数组
在编程中,数组(Array)是一种数据结构,用于存储相同类型的多个元素。这些元素按照顺序排列,并通过索引(通常是非负整数)来访问。数组可以包含各种数据类型,例如整数、浮点数、字符串,甚至其他数组。
在许多编程语言中,数组的大小是固定的,一旦创建就无法改变。然而,JavaScript中的数组,长度是动态可变的,如果学过其他编程语言的朋友可能对这一点不是很习惯。
数组的基本特点包括:
- 索引: 每个元素都有一个唯一的索引,用于访问该元素。
- 连续存储: 数组中的元素在内存中是连续存储的,这有助于快速访问元素。
- 相同类型: 数组通常只能存储相同类型的元素,尽管有些编程语言支持混合类型数组。
- 固定大小或动态大小: 数组可以是固定大小的,也可以是动态大小的。
在许多编程语言中,数组是一个重要的数据结构,用于存储和操作大量数据。可以通过创建数组来存储一组数据,并通过索引来访问和操作这些数据。
二、数组初识
每一门编程语言,都有数组或类似数组的结构,同样的JavaScript(虽然是脚本语言也不例外。
JavaScript中的数组是一种用于存储多个值的数据结构。数组是一种有序集合,每个值在数组中都有一个数字索引,从0开始,不支持负数索引。JavaScript数组可以包含任意类型的值,包括数字、字符串、对象、函数等。
下面是关于JavaScript数组的一些重要信息:
- 创建数组:可以使用数组字面量
[]
或Array
构造函数来创建数组。
| |
| let numbers = [1, 2, 3, 4, 5]; |
| |
| |
| let colors = new Array('red', 'green', 'blue'); |
- 访问数组元素:通过索引访问数组元素。数组索引从0开始。
| let fruits = ['apple', 'banana', 'orange']; |
| console.log(fruits[0]); |
- 数组长度:可以通过
length
属性获取数组的长度。
| console.log(fruits.length); |
- 修改数组元素:可以通过索引修改数组元素。
| fruits[1] = 'grape'; |
| console.log(fruits); |
- 数组方法:JavaScript提供了许多数组方法来操作数组,例如
push()
、pop()
、shift()
、unshift()
、splice()
、slice()
等。
| let numbers = [1, 2, 3, 4, 5]; |
| numbers.push(6); |
| numbers.pop(); |
| numbers.shift(); |
| numbers.unshift(0); |
- 迭代数组:可以使用循环或数组方法对数组进行迭代。
| fruits.forEach(function(fruit) { |
| console.log(fruit); |
| }); |
| |
| for (let i = 0; i < fruits.length; i++) { |
| console.log(fruits[i]); |
| } |
- 多维数组:JavaScript中的数组可以是多维的,也就是数组的元素本身也可以是数组。
| let matrix = [[1, 2], [3, 4], [5, 6]]; |
| console.log(matrix[1][0]); |
JavaScript中的数组是一种灵活且强大的数据结构,可以用于存储和操作各种类型的数据。通过熟练掌握数组的特性和方法,可以更有效地处理和管理数据。
三、认识数组:数组的基本方法
方法名称 |
功能描述 |
返回值类型 |
是否改变原数组 |
forEach/for...of |
遍历数组(forEach处理每个元素,for...of可读取元素并自动解包) |
无 |
不会 |
concat |
合并数组 |
新数组 |
不会 |
join |
将数组转化为字符串 |
字符串 |
不会 |
pop |
删除数组最后一个元素 |
删除的数据(即数组最后一个元素) |
会 |
shift |
删除数组第一个元素 |
删除的数据(即数组第一个元素) |
会 |
unshift |
在数组开头插入元素 |
新数组长度 |
会 |
push |
在数组末尾添加元素 |
新数组长度 |
会 |
reverse |
翻转数组顺序 |
翻转后的数组 |
会 |
sort |
对数组元素排序 |
排序后的数组 |
会 |
slice |
截取数组部分元素 |
新数组 |
不会 |
splice |
插入、删除或替换数组元素 |
被删除或替换的元素 |
会 |
toString |
数组转为字符串 |
字符串 |
不会 |
valueOf |
获取数组原始值 |
原始值 |
不会 |
indexOf |
查找指定元素在数组中的位置 |
元素索引(若不存在则返回 -1) |
不会 |
lastIndexOf |
查找指定元素在数组中最后一次出现的位置 |
元素索引 |
不会 |
map |
应用函数映射数组元素 |
新数组 |
不会 |
filter |
根据条件筛选数组元素 |
新数组 |
不会 |
every |
判断数组所有元素是否都满足条件 |
布尔值 |
不会 |
some |
判断数组是否有元素满足条件 |
布尔值 |
不会 |
reduce |
按规则累积数组元素生成单个返回值 |
单一返回值 |
可以,但通常不会直接改变原数组 |
rightReduce |
类似于reduce,但从数组末尾开始累积 |
单一返回值 |
可以,但通常不会直接改变原数组 |
(1)forEach
和 for...of
- 遍历数组(forEach处理每个元素,for...of可读取元素并自动解包)
| let arr = [1, 2, 3, 4, 5]; |
| |
| |
| arr.forEach((item, index) => { |
| console.log(`Element at index ${index}: ${item}`); |
| }); |
| |
| arr.forEach(function (item,index) { |
| console.log(`Element at index ${index}: ${item}`); |
| }); |
| |
| |
| for (const item of arr) { |
| console.log(item); |
| } |
(2)concat
| let arr1 = [1, 2, 3]; |
| let arr2 = [4, 5, 6]; |
| let arr3 = arr1.concat(arr2); |
| console.log(arr1); |
(3)join
| let arr = ['apple', 'banana', 'cherry']; |
| let str = arr.join(', '); |
| console.log(str); |
| |
| # python中join方法 |
| lst = ['apple', 'banana', 'cherry', 'orange'] |
| x = '-'.join(lst) |
(4)pop
和 shift
-
pop
删除数组最后一个元素
-
shift
删除数组第一个元素
| let arr = ['a', 'b', 'c']; |
| |
| |
| let poppedItem = arr.pop(); |
| console.log(poppedItem); |
| console.log(arr); |
| |
| |
| let shiftedItem = arr.shift(); |
| console.log(shiftedItem); |
| console.log(arr); |
(5)unshift
| let arr = ['b', 'c']; |
| arr.unshift('a'); |
| console.log(arr); |
(6)push
| let arr = ['a', 'b']; |
| arr.push('c', 'd'); |
| console.log(arr); |
(7)reverse
| let arr = ['a', 'b', 'c']; |
| arr.reverse(); |
| console.log(arr); |
(8)sort
| let arr = [3, 1, 4, 1, 5, 9]; |
| arr.sort((a, b) => a - b); |
| console.log(arr); |
(9)slice
| let arr = ['a', 'b', 'c', 'd', 'e']; |
| let slicedArr = arr.slice(1, 4); |
| console.log(slicedArr); |
| console.log(arr); |
(10)splice
| let arr = ['a', 'b', 'c', 'd', 'e']; |
| let removedItems = arr.splice(2, 2, 'x', 'y'); |
| console.log(removedItems); |
| console.log(arr); |
(11)toString
| let arr = [1, 2, 3]; |
| let str = arr.toString(); |
| console.log(str); |
(12)valueOf
| let arr = [1, 2, 3]; |
| let val = arr.valueOf(); |
| console.log(val); |
(13)indexOf
| let arr = ['a', 'b', 'c', 'd', 'a']; |
| let index = arr.indexOf('a'); |
| console.log(index); |
(14)lastIndexOf
| let arr = ['a', 'b', 'c', 'a', 'b']; |
| let lastIndex = arr.lastIndexOf('a'); |
| console.log(lastIndex); |
(15)map
| let arr = [1, 2, 3, 4, 5]; |
| let squaredArr = arr.map(num => num * num); |
| console.log(squaredArr); |
(16)filter
| let arr = [1, 2, 3, 4, 5]; |
| let evenNumbers = arr.filter(num => num % 2 === 0); |
| console.log(evenNumbers); |
(17)every
| let arr = [true, true, false]; |
| let allTrue = arr.every(val => val); |
| console.log(allTrue); |
(18)some
| let arr = [false, false, true]; |
| let containsTrue = arr.some(val => val); |
| console.log(containsTrue); |
(19)reduce
| let arr = [1, 2, 3, 4, 5]; |
| let sum = arr.reduce((total, num) => total + num, 0); |
| console.log(sum); |
(20)rightReduce
- 类似于reduce,但从数组末尾开始累积
- 此方法不是ES6标准提供的,但可以通过扩展运算符实现类似效果
| let arr = [1, 2, 3, 4, 5]; |
| let reversedSum = arr.reduceRight((total, num) => total + num, 0); |
| console.log(reversedSum); |
(21)统计数组长度
| var arr= [11,22,33,44,55,66]; |
| |
| |
| arr |
| |
| |
| |
| arr.length |
| |
四、掌握数组:数组的进阶方法
(1)splice()方法
splice()
方法是 JavaScript 数组对象的一个方法,用于向数组中添加或删除元素。splice()
方法可以实现以下功能:
- 删除元素:可以删除指定位置的元素。
- 添加元素:可以在指定位置添加新元素。
- 替换元素:可以删除指定位置的元素,并在该位置添加新元素。
splice()
方法的语法如下:
| array.splice(start, deleteCount, item1, item2, ...) |
start
:指定修改的起始位置(索引),从该位置开始进行操作。
deleteCount
:要删除的元素个数。如果设置为 0,则不删除元素。
item1, item2, ...
:要添加到数组的元素。
splice()
方法会修改原始数组,并返回一个包含被删除元素的数组。如果没有删除任何元素,则返回一个空数组。
以下是一些示例,演示splice()
方法的用法:
删除元素
| let fruits = ['apple', 'banana', 'cherry', 'date']; |
| |
| |
| fruits.splice(2, 1); |
| |
| |
添加元素
| let fruits = ['apple', 'banana', 'cherry']; |
| |
| |
| fruits.splice(1, 0, 'orange'); |
| |
| |
替换元素
| let fruits = ['apple', 'banana', 'cherry', 'date']; |
| |
| |
| fruits.splice(2, 1, 'lemon'); |
| |
| |
splice()
方法是一个非常灵活和强大的方法,可以在数组中进行各种添加、删除和替换操作。需要注意的是,splice()
方法会直接修改原始数组。
(2) forEach()方法
forEach()
是JavaScript数组对象的一个方法,用于遍历数组中的每个元素,并对每个元素执行提供的回调函数。下面是forEach()
方法的一般语法:
| array.forEach(function(currentValue, index, arr), thisValue) |
currentValue
:当前元素的值。
index
:当前元素的索引。
arr
:当前正在操作的数组。
thisValue
(可选):在回调函数中,使用该值作为 this
对象。如果省略,将使用全局对象。
在forEach()
方法中,可以传递一个回调函数作为参数,这个回调函数将在数组中的每个元素上被调用。回调函数可以接受三个参数:当前元素的值、当前元素的索引和数组本身。这样,你可以在回调函数中对数组的每个元素进行操作。
以下是一个简单的示例,演示如何使用forEach()
方法:
| const numbers = [1, 2, 3, 4, 5]; |
| |
| numbers.forEach(function(number, index) { |
| console.log(`Number at index ${index} is ${number}`); |
| }); |
在这个示例中,forEach()
方法遍历了numbers
数组中的每个元素,并输出了每个元素的值和索引。
需要注意的是,forEach()
方法会在遍历数组的过程中修改原始数组。如果需要对数组进行操作而不改变原始数组,可以考虑使用map()
方法。
代码演示
| var l = [1,2,3,4,5] |
| |
| l.forEach(function(value){console.log(value)},l) |
| VM2464:1 1 |
| VM2464:1 2 |
| VM2464:1 3 |
| VM2464:1 4 |
| VM2464:1 5 |
| |
| l.forEach(function(value,index){console.log(value,index)},l) |
| VM2514:1 1 0 |
| VM2514:1 2 1 |
| VM2514:1 3 2 |
| VM2514:1 4 3 |
| VM2514:1 5 4 |
| |
| l.forEach(function(value,index,arr){console.log(value,index,arr)},l) |
| VM2965:1 1 0 (5) [1, 2, 3, 4, 5] |
| VM2965:1 2 1 (5) [1, 2, 3, 4, 5] |
| VM2965:1 3 2 (5) [1, 2, 3, 4, 5] |
| VM2965:1 4 3 (5) [1, 2, 3, 4, 5] |
| VM2965:1 5 4 (5) [1, 2, 3, 4, 5] |
| |
| l.forEach(function(value,index,arr,xxx){console.log(value,index,arr,xxx)},l) |
| VM2996:1 1 0 (5) [1, 2, 3, 4, 5] undefined |
| VM2996:1 2 1 (5) [1, 2, 3, 4, 5] undefined |
| VM2996:1 3 2 (5) [1, 2, 3, 4, 5] undefined |
| VM2996:1 4 3 (5) [1, 2, 3, 4, 5] undefined |
| VM2996:1 5 4 (5) [1, 2, 3, 4, 5] undefined |
(3)map()方法
map()
方法是 JavaScript 数组对象的一个方法,用于创建一个新数组,新数组的元素是原始数组经过指定函数处理后的结果。map()
方法不会修改原始数组,而是返回一个新的数组。
map()
方法的语法如下:
| const new_array = array.map(function callback(currentValue, index, array) { |
| |
| }, thisArg); |
callback
函数:用来生成新数组元素的函数,可以接受三个参数:
currentValue
:当前元素的值。
index
(可选):当前元素的索引。
array
(可选):调用 map()
方法的数组。
thisArg
(可选):执行 callback
函数时使用的 this
值。
map()
方法会遍历原始数组的每个元素,对每个元素应用提供的回调函数,并将返回值组成一个新数组。原始数组保持不变。
以下是一个简单的示例,演示如何使用 map()
方法:
| const numbers = [1, 2, 3, 4, 5]; |
| |
| const doubled = numbers.map(function(num) { |
| return num * 2; |
| }); |
| |
| |
在上面的示例中,map()
方法遍历 numbers
数组中的每个元素,并将每个元素乘以 2,然后将结果存储在新数组 doubled
中。
map()
方法非常适合用于对数组中的每个元素进行某种转换或处理操作,生成一个新的数组。由于它不会修改原始数组,因此在需要保留原始数据的情况下很有用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!