目录
一、什么是数据结构
总而言之,数据结构就是在计算机中存储和组织数据的方式。
常用数据结构如下图所示:
常见的数据结构较多,每一种都有其对应的应用场景,不同的数据结构的不同操作性能是不同的。 有的查询性能很快,有的插入头和尾速度很快,有的做范围查找很快,有的允许元素重复,有的不允许重复等等。在开发中如何选择,要根据具体的需求来选择。
二、什么是算法
Algorithm这个单词本意是解决问题的办法,数据结构的实现是离不开算法的。
三、数组
1.数组的基本使用
(1).创建和初始化数组
//创建和初始化数组
var daysOfWeek = new Array()
var daysOfWeek = new Array(7)
var daysOfWeek = new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')
(2). 数组长度和遍历数组
获取数组的长度
alert(daysOfWeek.length)
通过下标值来遍历数组
//使用 for 遍历数组
for(var i = 0; i < daysOfWeek.length; i++){
alert( daysOfWeek[i] )
}
//使用 foreach 遍历数组
daysOfWeek.forEach( function(value) {
alert(value)
})
2.数组的常见操作
数组的常见操作有:添加元素、删除元素、修改元素、获取元素
(1).添加元素
假设有一个数组为:numbers,初始化这个数组
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
添加一个元素到数组的最后位置:
//方式一
numbers[numbers.length] = 10
//方式二
numbers.push(11)
numbers.push(12, 13)
alert(numbers)
在数组首位插入一个元素
//在数组首位插入一个元素
for(var i = numbers.length; i > 0; i--){
numbers[i] = numbers[i - 1]
}
numbers[0] = -1
alert(numbers) // -1,0,1,2,3,4,5,6,7,8,9,10,11,12,13
上面代码的实现原理:
上面代码的实现性能不高,在中间位置插入元素的效率比链表低
另,在数组首位插入数据可以使用 unshift 方法
//通过unshift在首位插入数据
numbers.unshift(-2)
numbers.unshift(-4,-3)
alert(numbers) // -4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13
(2).删除元素
删除数组最后的元素,可以使用pop()方法
//删除最后的元素
numbers.pop()
alert(numbers) //-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12
删除首位的元素,自己实现代码:
//删除首位元素
for(var i = 0; i < numbers.length; i++){
numbers[i] = numbers[i+1]
}
numbers.pop()
alert(numbers)
移除首位元素可以直接使用shift方法来实现:
numbers.shift()
alert(numbers)
(3).任意位置
通过splice删除数据
//删除指定位置的几个元素
numbers.splice( 5,3 )
alert(numbers) //-4,-3,-2,-1,0,4,5,6,7,8,9,10,11,12,13
使用splice来插入数据
//插入指定位置元素
numbers.splice(5,0,3,2,1)
alert(numbers) //-4,-3,-2,-1,0,3,2,1,4,5,6,7,8,9,10,11,12,13
使用splice来修改数据
//修改指定位置的元素
numbers.splice(5,3,"a","b","c")
alert(numbers) // -4,-3,-2,-1,0,a,b,c,4,5,6,7,8,9,10,11,12,13
3.数组的其他操作
(1).常见方法
方法名 | 方法描述 |
concat | 连接2个或更多数组,并返回结果 |
every | 对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true,否则返回false |
filter | 对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组 |
forEach | 对数组中的每一项运行给定函数,这个方法没有返回值 |
join | 将所有的数组元素连接成一个字符串 |
indexOf | 返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1 |
lastIndexOf | 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值 |
map | 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组 |
reverse | 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个 |
slice | 传入索引值,将数组里对应索引范围内的元素作为新数组返回 |
some | 对数组中的每一项运行给定函数,如果任意一项返回true,则结果为true,并且迭代结束 |
sort | 按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数 |
toString | 将数组作为字符串返回 |
valueOf | 和toString类似,将数组作为字符串返回 |
(2).数组合并
数组的合并很简单,使用concat即可(也可以直接+进行合并)
//数组的合并
var nums1 = [1,2,3]
var nums2 = [100,200,300]
var newNums = nums1.concat(nums2)
alert(newNums) //1,2,3,100,200,300
newNums = nums1 + nums2
alert(newNums) //1,2,3,100,200,300
(3).迭代方法
every()方法
every()方法是将数组中每一个元素传入到一个函数中,该函数返回true/false
如果函数中每一个元素都返回true,那么结果为true,有一个为false,那么结果为false
案例:判断一组元素中是否都包含某一个字符
//定义数组
var names = ['abc','cb','mba','dna']
//判断数组的元素是否都包含a字符
var flag = names.every(function(t){
return t.indexOf('a') != -1
})
alert(flag)
some() 方法
some()方法是将数组中每一个元素传入到一个函数中,该函数返回true/false
但是和every不同的是,一旦有一次函数返回了true,那么迭代就会结束,并且结果为true
案例:判断数组的元素是否有包含a字符的字符
//定义数组
var names = ['abc','cb','mba','dna']
//判断数组的元素是否有包含a字符的字符
var flag = names.some(function(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()方法
filter()方法是一种过滤的函数
首先会遍历数组中每一个元素传入到函数中
函数的结果返回true,那么这个元素会被添加到最新的数组中,返回false,则忽略该元素
最终会形成一个新的数组,该数组就是filter()方法的返回值
案例:获取names中所有包含'a'字符的元素
//定义数组
var names = ['abc','cb','mba','dna']
//获取names中所有包含'a'字符的元素
var newNames = names.filter(function(t){
return t.indexOf('a') != -1
})
alert(newNames)
map()方法
map()方法提供的是一种映射函数
首先会遍历数组中每一个元素传入到函数中
元素会经过函数中的指令进行各种变换,生成新的元素,并且将新的元素返回
最终会将返回的所有元素形成一个新的数组,该数组就是map()方法的返回值
案例:在names中所有的元素后面拼接-abc
//定义数组
var names = ['abc','cb','mba','dna']
//在names中所有的元素后面拼接-abc
var newNames = names.map(function(t){
return t + '-abc'
})
alert(newNames)
(4).reduce方法
以下是reduce方法需要的参数:
arr.reduce(callback[,initialValue])
使用for实现
//1.定义数组
var numbers = [1,2,3,4]
//2.for实现累加
var total = 0
for(var i = 0; i < numbers.length; i++){
total += numbers[i]
}
alert(total) //10
使用forEach简化for循环
相对于for循环,forEach更符合我们的思维(遍历数组中的元素)
//3.使用forEach
var total =0
numbers.forEach(function(t){
total += t
})
alert(total)
使用reduce方法实现
//4.使用reduce方法
var total = numbers.reduce(function(t){
return pre + cur
})
alert(total)