JS基础知识总结3(数组)
前言
鉴于本人还处于学习阶段,以下内容为个人理解所做笔记,可能存在一定错误,如果能指出错误之处感激不尽,希望能与大家共同进步。
一、数组(array)概念
数组就是数据的集合,类似对象,只不过里面存储的是数据而不是变量名
1)长度:表示数组内有多少个数据,使用【变量名.length】可以查看数组长度。查看长度:consoel.log(arr.length)
2)索引(下标):表示数据在数组内处于第几个位置
(所有语言中索引计数都是从0开始,即第一个索引为0,最后一个索引为 arr.length - 1)
arr[0]:表示arr这个数组第一位的数据
arr[n]:表示arr这个数组第n位的数据
arr[arr.length - 1]表示arr这个数组最后一位数据
二、常用数组方法
1、创建一个数组
1)直接使用字面量 [ ]:这就代表着一个空数组
var arr_1 = [ ] arr_1 为空数组
var arr_2 = [1,2,“三”,true ] arr_2为有数据的数组
2)使用内置构造函数 new Array();
var arr_3 = new Array(); arr_3为空数组
var arr_4 = new Array(10); arr_4为10位数组
var arr_5 = new Array(1,2,3,4) arr_5为有数据数组
2、改变一个数组的值
如果是按照基础数据类型那种更改数值的方法直接赋值,那会开辟一个新的地址来存储新的数据,而不是在原地址中修改数据
1)变量.push(4):在最末尾添加一个元素4
返回值为新数组长度
2)变量.pop():删除最末尾的一个元素
返回值为被删除的元素
3)变量.unshift(0):在最前面添加一个元素0
返回值为新数组长度
4)变量.shift():删除最前面的一个元素
返回值为被删除的元素
5)变量.splice(开始的索引位置,截取多少个(为0则可以添加元素),替换的元素(不写则删除原元素)):按照索引截取数组中的某些内容
返回值是被删除的元素的集合
3、反转一个数组的值
变量.reverse
4、对数组排序
变量.sort():对数组内部数据进行排序,排序方法可以自己制定
参数需要一个描述排序规则的函数和一个比较两个数值的函数
规则函数
比较函数:返回值表明比较的两个数a,b之间的大小顺序
以从小到大为例:
a<b 返回负数
a== b 返回0
a>b 返回正数
以上可以简化为return a-b,从大到小为return b-a即
//从小到大排序
arr.sort(function(a,b)){
return a-b
}
//从大到小排序
arr.sort(function(a,b)){
return b-a
}
5、拼接多个数组
变量.concat(arr2或[数据,数据,数据]):不改变原数组,而是返回拼接好的新数组
6、链接数组每一个值
变量.join(’‘链接符’‘):不改变原数组,返回值为链接好的字符串,默认链接符为,可以自定义
7、具有一定兼容问题的方法
之前介绍的几个方法都是较早推出的ES3方法兼容性较好,接下来介绍的几个方法需要考虑到兼容问题
(一)ES5数组常用方法
1)indexOf:用来找到数组中某一项的索引,从前开始查找
语法:变量.indexOf(需要寻找的数组元素)
返回值:有返回索引,没有返回-1
2)lastIndexOf:用来找到数组中某一项的索引,从后开始查找
语法:变量.indexOf(需要寻找的数组元素)
返回值:有返回索引,没有返回-1
3)forEach:用来遍历数组,遍历每一个元素都会执行一次函数function(item,index)
语法:变量.forEach(function(item,index)){
}
item:遍历到的数组元素
index:对应的索引
4)map:用来遍历数组,可以对每一项进行操作,并返回一个新的数组
语法:变量.map(function(item,index)){
对item的操作
return item;
}
5)filter:按照制定的条件对数组进行筛选,筛选出满足条件的组成新的数组并返回
语法:变量.filter(function(item,index)){
对item的操作
return item;
}
每次循环都有返回值,不设置则默认为undefined,返回值会转为boolean型数据,为ture符合条件会放到新数组中,false不符合条件
三、数组的遍历
因为可以按照索引去获取数组内容,数组索引又是按0-n的顺序排列,所以可以通过for循环按顺序输出数组内数据,这种按顺序输出每一个数据叫做遍历。
通过for循环打印数组
for(var i=0;i<arr.length;i++){
console.log(arr[i])
}
四、数组排序
1、冒泡排序
(从小到大冒泡)原理:遍历数组,比较数组(n位)内相邻的两个数据大小,如果前一个大于后一个两者交换位置,第一次遍历(n-1次)最大的数将移动到数组最后一个位置,第二次遍历(n-2次)第二大的数将移动到数组倒数第二个位置,第i次遍历(n-i次)第i大的数将移动到数组倒数第i个位置。
格式
for(var j=0;j<arr.length-1;j++){
for(var i = 0;i < arr.length-j-1;i++){
if(arr[minIndex]>arr[i]){
var temp = arr[i];
arr[i] = arr[i+1]
arr[i+1] = temp
}
}
2、选择排序
原理:假定第0个就是最小数字对应的索引,遍历数组,只要有比第0个数字小的就将0替换为当前数字对应的索引,遍历结束就能找到最小数对应的索引n,最后将arr[0]与arr[n]对换;依次对第1、2、……、n进行选择排序,最后得到的数组内数据就是按从小到大排序的
格式
for(var i = 0;i < arr.length-1;i++){
var minIndex = i
for(var j = i+1;j < arr.length; j++){
if(arr[minIndex]>arr[i]){
minIndex = i
}
}
var temp = arr[i];
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
五、练习题
以下练习题均为本人培训过程中老师当天布置的练习题,对理解数组有很大的帮助,我会将个人的解题代码放置最后,个人水平有限仅供参考
强化练习1
-
定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。试编程。
var arr = [2, 4, 6, 8, ..., 60] // 结果是一个新的数组 // [6, 16, 26, 36, 46, 56]
-
通过循环按执行顺序,做一个5×5的二维数组,赋1到25的自然数,然后输出该数组的左下半三角。试编程。
// 结果 [ [1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25] ]
强化练习2
-
随机生成一个五位以内的数,然后输出该数共有多少位,每位分别是什么
-
数组的冒泡排序
-
数组的选择排序
-
编写函数map(arr) 把数组中的每一位数字都增加30%,并返回一个新数组
var arr = [10, 100, 1000] function map() { // code in here ... } console.log(map(arr)) // [13, 130, 1300]
-
编写函数has(arr , 60) 判断数组中是否存在60这个元素,返回布尔类型
var arr = [1, 2, 3, 60]
var arr2 = [1, 2, 3]
function has() {
// code in here ...
}
console.log(has(arr, 60)) // true
console.log(has(arr2, 60)) // false
强化练习3
-
编写函数norepeat(arr) 将数组的重复元素去掉,并返回新的数组
var arr = [1, 1, 2, 3, 4, 4, 2, 1, 3, 5] function norepeat() { // code in here ... } console.log(norepeat(arr)) // [1, 2, 3, 4, 5]
-
有一个从小到大排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
-
创建一个对象,该对象存储一个学生的信息,该对象包含学号、身份证、年龄、性别、所学专业等属性信息,同时该对象包含一个自我介绍的方法,用来输出该对象的所有信息
// 强化练习1
// 1 定义长度30的数组,每五个求平均数存储到另一个数组中
function arr_defin(){
var arr = [30]
var arr_ave = []
var k = 0
for(i=0;i<30;i++){
arr[i]=2*(i+1)
if((i+1)%5 == 0){
var sum = 0
for(j=i-4;j<=i;j++){
sum += arr[j]
}
arr_ave[k] = sum/5
k ++
}
}
console.log(arr)
console.log(arr_ave)
}