数据结构与算法之数组结构
JS 的数组就是API的调用
一.其他语言的数组的封装(比如Java的ArrayList)
- 为什么js的数组不需要封装,而java的需要封装呢? :因为java中的数组结构相对来说比较底层,而js当中对数组的操作封装的很好
- 常见的语言的数组不能存放不同的数据类型,因此所有在封装时通常存放在数组中的时Object类型
- 常见语言的数组容量不会自动改变(需要进行扩容操作)
- 常见的语言的数组进行中间插入和删除操作性能比较低
- 当其他语言进行中间插入的时候,后面的数据必须先全部一个一个全部往后移动一个位置,空出一个位置后,才能插入数据
- 当其他语言进行删除的时候,还必须把后面的元素全部往前移动一个位置,因为删除了第一个元素,第一个是空的,通过索引0是取不到数据的,而后面的元素又不会动态的补上
所以我们为什么还要使用数组呢?
- 通过下标值取数据的时候,效率非常高,能够直接定位的那个数据,进行修改,和查询
二. 数组API的常见操作
定义一个数组 let numbers =[1,2,3,4,5,6]
添加元素
//在数组的最后一个位置添加元素
numbers.push(11) //1,2,3,4,5,6,11
//在数组的头部位置添加一个元素
for (var i = numbers.length; i > 0; i--) {
numbers[i] = numbers[i-1]
}
numbers[0] = -1
alert(numbers) // -1,1,2,3,4,5,6 (取到最后一个元素的后面一个位置,从后开始,将前面的一个赋值给后面一个,最后就空出头部位置了)
删除元素
// 删除最后的元素
numbers.pop() //1,2,3,4,5
//删除头部的元素
numbers.shift() //2,3,4,5,6
任意位置的删除和修改
//删除 指定位置的几个元素 (几个元素,不是第几个)
numbers.splice(1, 2) //1,4,5,6
//修改 指定位置的几个元素
numbers.splice(1, 2, "a", "b") //1,a,b,4,5,6
这种操作会先删除,在添加写入的元素:先从索引1开始删除两个,在从删除的地方加上a,b两个元素
eg:
numbers.splice(1, 2, "a") //1,a,4,5,6
numbers.splice(1, 3, "a") //1,a,5,6
常见的其他数组方法
concats | 连接两个或者更多数组,并返回结果 |
---|---|
every | 对数组中的每一项运行给定函数,如果该函数对每一项都返回 true ,则返回true , 否则返回false |
filter | 对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组 |
forEach | 对数组中的每一项运行给定函数。这个方法没有返回值 |
join | 将所有的数组元素连接成一个字符串 |
indexOf | 返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1 |
lastIndexOf | 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值 |
map | 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组 |
reverse | 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个 |
slice | 传入索引值,将数组里对应索引范围内的元素作为新数组返回 |
some | 对数组中的每一项运行给定函数,如果任一项返回 true ,则结果为true , 并且迭代结束 |
sort | 按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数 |
toString | 将数组作为字符串返回 |
valueOf | 和 toString 类似,将数组作为字符串返回 |
数组的合并
// 数组的合并
var nums1 = [1, 2, 3]
var nums2 = [100, 200, 300]
var newNums = nums1.concat(nums2)
alert(newNums) // 1,2,3,100,200,300
迭代方法
every()方法
- every()方法是将数组中每一个元素传入到一个函数中, 该函数返回true/false.
- 如果函数中每一个元素都返回true, 那么结果为true, 有一个为false, 那么结果为false
- every()练习 :
- 判断一组元素中是否 都 包含某一个字符
// 定义数组
var names = ["abc", "cb", "mba", "dna"]
// 判断数组的元素是否都包含a字符
var flag = names.every(function (t) {
return t.indexOf('a') != -1 //indexof方法等于-1为没找到,找到了返回第一个索引
})
alert(flag) //false
some()方法
- some()方法是将数组中每一个元素传入到一个函数中, 该函数返回true/false
- 但是和every不同的是, 一旦有一次函数返回了true, 那么迭代就会结束. 并且结果为true
- some()练习 :
- 判断一组元素中是否 包含某一个字符
// 定义数组
var names = ["abc", "cb", "mba", "dna"]
// 判断数组中是否包含有a字符的字符
var flag = names.some(function (t) {
alert(t)
return t.indexOf("a") != -1
})
alert(flag)
forEach()方法
- forEach()方法仅仅是一种快速迭代数组的方式而已
- 该方法不需要返回值
- forEach的练习
// 定义数组
var names = ["abc", "cb", "mba", "dna"]
// forEach的使用
names.forEach(function (t) {
alert(t)
}) //弹出四次框 ,分别对应数组的每一项
另外三个filter,map,reduce方法在关于js的随笔中有所阐述
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 因为Apifox不支持离线,我果断选择了Apipost!
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端