数组
基础概念
背景
在生活中,一般使用仓库来保存多个数据(比如快递).仓库内部会有一个编号对应每个数据,可以通过这个编号来快速找到想要的快递。
程序中的仓库:使用数组来处理.比如所有学生的成绩保存
数组概念
- 概念:数组,即程序数据的”仓库”,可以用来保存多个数据。
- 官方定义:数组是一个有序数据的集合,数组的每个数据都有一个对应的编号(下标),用来快速检索。
- 比如保存多个学生成绩
下标(数组中每个数据的编号)
- 概念:下标是
一个数字
,用于表示该数据在数组中的 位置。可以通过下标来快速找到想要的数据
。 - 原理:数组中的第一个数据的下标为0,第二个数据的下标为1,依次递增。最后一个数据的下标为数组中的数据个数-1.即
数组.length-1
基本使用
定义数组
空数组
1. 数组字面量: []
var 变量名 = [];// 定义了一个空的数组并把数组保存到一个变量中
2. 新的数组对象
var 变量名 = new Array();//定义一个新的数组对象并保存到变量中
带有默认数据的数组
1. 字面量:数据之间以逗号分割
var 变量名 =[数据1,数据2,数据3,...,数据n];
2. 数组对象
var 变量名 = new Array(数据1,数据2,数据3,...,数据n);
数组的基本使用
var nums =[59,98,61,78,45];
- 通过下标获取数组中的指定一个数据
数组变量名[下标];
例如:
nums[2] // 得到的是61
- 通过下标修改数组中的指定一个数据
数组变量名[下标]= 新数据
例如:
nums[2]=70;//将61改为70
- 添加数据到数组中
数组变量名[新的下标] =数据;
//给数组末尾添加数据,更灵活点
数组变量名[数组变量名.length] =数据;
例如:
nums[5]=80; // nums : 59,98,61,78,45,80
nums[nums.length] =80;//效果跟上面是一致的。
- 删除数组中的数据(删除最后一个)
数组变量名.length--;
- 数组中 的数据个数(即数组的长度)
数组变量名.length;
例如:
document.write(nums.length);// [59,98,61,78,45].length 5
- 获取数组中的所有数据(数组遍历)
for(var i=0;i<数组变量名.length;i++){
nums[i]
}
//例子:
for(var i=0;i<nums.length;i++){
document.write(nums[i]+"<br>");
}
练习
练习:
完成快递仓库的数据管理
1. 在仓库中追加多个快递:顺丰、圆通、韵达、韵达、百世、滴答、顺丰、顺丰
2. 输出所有的快递
3. 删除最后一个快递并输出该快递
4. 仓库中有几个快递
5. 扩展:倒序输出快递
6. 扩展:仓库中有几个顺丰快递,几个韵达快递
常规应用
随机数据
var names = ["周星星", "达叔", "李云龙", "栋东", "渣渣辉", "墟锟"];
//随机下标 (0-5)
var index = parseInt(Math.random() * names.length);
document.write(names[index]);
最大值最小值
//数组中的最大值
var arr= [2,30,1,9,5,7];
var max =arr[0];//假设第一个就是最大值
//思路:依次和 数组中的 每个数据进行对比,如果对比的数组数据比max高,把更高的数据赋给max
for(var i=0;i<arr.length;i++){
if(max < arr[i]){
//重新赋给max
max = arr[i];
}
}
document.write(max);//30
倒序排列
// 原数组交换
for(var i=0;i<arr.length/2;i++){
//当下标为i的数据和下标为arr.length-1-i 进行交换
// a: arr[i] b:arr[arr.length-i-1]
var temp =arr[i];
arr[i] =arr[arr.length-i-1];
arr[arr.length-i-1] =temp;
}
document.write(arr);
//2 新数组方式
var arr= [2,30,1,9,5,7];// => [7,5,9,1,30,2]
var newArr =[];
for(var i=arr.length-1;i>=0;i--){
//将arr[i]追加到newArr中
newArr[newArr.length] = arr[i];
}
document.write(newArr);
指定位置插入和删除
//删除
var arr = [1,2,3,4,5,6];//=>[1,2,4,5,6];
var index = 2;//待删除的下标
for(var i =index;i<arr.length-1;i++){
arr[i]=arr[i+1];
}
arr.length--;
var arr = [1,2,4,5,6];
var index = 0;//插入下标
var data = 3;//插入的数据
arr.length++;//添加一个位置
for(var i=arr.length-1;i>=index;i--){
arr[i] = arr[i-1];
}
//指定位置设置数据
arr[index]=data;
document.write(arr);
合并数组
去重
练习
1.完成数组的指定位置插入。比如[1,2,4,5]中下标为2处插入一个3,结果为[1,2,3,4,5]; 要插入的数由用户输入提供
2.完成数组的合并。比如[1,2,3,4]和[5,6,7,8]; 合并后形成一个新数组[1,2,3,4,5,6,7,8]
3.登录验证:定义两个数组分别保存用户名和密码,保持长度一致,用于存放一批用户名和密码。然后验证用户输入的用户名和密码是否正确。(用户名和密码在数组中的位置上是一一对应的)
4.第三题扩展:完成3次登录判断验证。用户有3次输入机会,用户名输入正确后剩余用户名次数作废的同时密码也有3次验证。3次用户名或密码都没输对,则程序终止。
常用api
API
- 用户编程接口(application programming interface): 用户能够直接使用的代码。一个api带有一个功能。比如parseInt()就是一个api,功能是进行取整,再比如Math.random()、Number()、toString()、toFixed()、prompt()、alert()
- 其实每个api就是一个函数
- api是程序内置的,用户可以直接使用,无需知道内部如何实现。
- 以下api都是数组相关部分api
常用api
- push
- pop
- slice
- splice
- unshift
- concat
- join
- reverse
- indexOf
- lastIndexOf
push:数组末尾添加数据
数组变量名.push(数据1,数据2,数据n);
例子:
var arr = [1,2,3,4,5];
arr.push(6);
arr.push(7,8,9);
document.write(arr);//[1,2,3,4,5,6,7,8,9];
pop:删除数组末尾最后一个数据,返回被删除的数据
数组变量名.pop();
例子:
var arr = [1,2,3,4,5];
//arr.pop();//删除最后一个数据
var data = arr.pop();//删除最后一个数据,data变量保存的是被删除的数据
document.write(arr);//[1,2,3,4,5];
unshift:数组开头添加一个多个数据
数组变量名.unshift(添加的数据);
例子:
var arr = [1,2,3,4,5];
arr.unshift(0);//开头添加0
document.write(arr);//[0,1,2,3,4,5];
splice:数组指定位置进行插入或删除数据
数组变量名.splice(插入或删除的开始下标,要删除的数量,插入的数据1,插入的数据2,插入的数据3,插入的数据n);
例子:
var arr = [1,2,3,4,5];
//只删除3 和4
//arr.splice(2,2);
//document.write(arr);//[1,2,5];
//删除2 和5
//arr.splice(1,1);
//arr.splice(3,1);
//document.write(arr);//[1,2,5];
//在3之前插入 6 和7
//arr.splice(2,0,6,7);
//document.write(arr);//[1,2,6,7,3,4,5];
//删除45,并追加67
arr.splice(3,2,6,7);//[1,2,3,6,7]
- 如果只有一个参数,那么会从开始下标开始,删除数组的后续所有元素
join:能够将数组里的数据拼接转为字符串
数组变量名.join(数据的分隔符号)
例子:
var arr = [1,2,3,4,5];
arr.join('-');
document.write(arr);
join
中默认的分割符号是,
。即数据之间以逗号分割。join
生成的字符串需要定义一个变量来接收,接收后进行使用
reverse:数组倒序存放
数组变量名.reverse();
var arr = [1,2,3,4,5];
arr.reverse();
document.write(arr);
- reverse是直接对原数组进行操作
concat :和一个或多个数组进行合并,得到一个新数组
数组变量名.concat(数组1,数组2,数组n);
例子:
var arr1 = [1,2,3,4,5];
var arr2= [6,7,8,9,10];
var arr3= [11,12,13,14,15];
//三个数组进行合并
var newArr = arr1.concat(arr2,arr3);
document.write(newArr);
- 对原数组没有影响,得到的是新数组
slice:根据下标获取数组中的部分数据
数组变量名.slice(子数组的开始下标,子数组的结束下标);
例子:
var arr1 = [1,2,3,4,5];
//获取[2,3,4];
var newArr =arr1.slice(1,4);
document.write(newArr);
//其他使用方式
var arr=["顺丰","韵达","圆通","顺丰","韵达","京东","京东","韵达","顺丰","京东"];
var newArr = arr.slice(arr.length-4,arr.length);
var newArr = arr.slice(arr.length-4);
var newArr = arr.slice(-4);
document.write(newArr);//都是最后四个
slice
获得的是一个新数组,所以一般需要变量接收后进行使用slice
:新数组是不包含结束下标对应数据- 如果直接以数组末尾结束,那么结束下标可以省略不写
- 支持开始下标为负数,从倒数第几个开始
indexOf:获取某数据在数组中的第一次出现的下标,没有的话返回-1
var index = 数组变量名.indexOf(数据);
例子:
var arr = [1,2,3,4,5,2];
var index = arr.indexOf(3);// 2
var index = arr.indexOf(2);// 1
var index = arr.indexOf(6);// -1
sort : 对数组进行排序
数组变量名.sort();//按照自然顺序进行排序
自定义排序:
数组变量名.sort(排序函数);
例子:
自然排序
var arr1 =[1,2,3,'c',7,4,'b',9,'a',8,6,5,'z'];
//默认排序
arr1.sort();
document.write(arr1);
自定义排序
var arr2 = [123,432,111,65,4,234,996,332];
function demo(num1,num2){
//表示数组中相邻的两个数据,根据return的结果来进行排序。
//如果return的结果大于0,那么num1就排在num2前面
//如果return的结果小于0,那么num1就排在num2后面
//如果return的结果==0,那么num1num2会挨在一起
return num2 -num1;
}
arr2.sort(demo);
document.write(arr2);// 996,432,332,234,123,111,65,4
随机打乱顺序
arr.sort(function(num1,num2){return Math.random()-0.5})
- 第一种排序-不添加参数:按照自然顺序来处理。自然顺序是按照0-9、a-z来进行排序
- 第二种需要我们提供一个排序函数,该函数就决定了数组里的两个相邻数据如何进行排序
lastIndexOf:获取某数据在数组中的最后一次出现的下标,没有的话返回-1
var index = 数组变量名.lastIndexOf(数据);
例子:
var arr = [1,2,3,4,5,2];
var index = arr.lastIndexOf(3);// 2
var index = arr.lastIndexOf(2);// 5
var index = arr.lastIndexOf(6);// -1
练习
1.定义一个成绩数组[45,12,89,92,53,76,89,61],完成以下题目
2.数组中追加34、89、90
3.删除第一个数据
4.删除最低分,并在同样的位置插入56、67
5.将数组转为字符串 进行输出,成绩间以”-”分割
6.获取第一次和最后一次出现89的下标
7.所有分数+5分
8.获取所有不及格的分数,并返回到一个新数组中
9.删除分数为92的分数,并在同一个位置插入67、87、90
10. 数组倒序存放
11. 获取除开第一个和最后一个的其他所有成绩
二维数组
概念
- 指的是一个数组中的 每个数据都是一个一维数组。
- 一维数组是一个数组中都是具体的数据。比如
[1,2,3,4,5]
作用
- 主要是用于来描述多个复合数据的集合。比如保存多个学生。每个学生又有姓名、年龄、性别等数据
基本操作
- 定义
var arr = [];
arr.push(['袁东栋',23,"男",59]);
arr.push(['周星星',24,"男",60]);
arr.push(['李云龙',35,"男",12]);
arr.push(['杨名名',24,"男",70]);
arr.push(['二营长',35,"男",20]);
二维数组本身就是一个普通的数组,只不过当里面的数据都是一维数组之后,我们称该数组为二维数组
- 获取数据
数组变量名[下标]
arr[0];// =>['袁东栋',23,"男",59]
arr[0][0] ;// =>['袁东栋',23,"男",59]中的袁东栋
- 添加数据
arr.push();
arr[arr.length]=新数据;
例子:
students.push(['詹姆斯',35,'男',80]);
- 删除数据
arr.length--;
- 修改数据
arr[0]=新数据;
例子:
//把['袁东栋',23,"男",59] 改成['张于航',34,'男',95]
students[0] = ['张于航',34,'男',95];
//把周星星改成 9527
students[1][0]=9527;
- 长度
数组变量名.length;
- 遍历