Js数组
一、数组
概念:数组本质上是一个大容器,可以帮助开发人员快速构建多个连续变量。
1.定义
快速定义
// 快速定义
var arr = [1,2,3,'张三','赵六'];//语法糖定义数组
标准定义
// 标准定义
arr = new Array(1,2,3,4,5);//构造函数构建数组
- JS中的数组是一个长度可变数组,每一个元素存储的数据可以是任意类型。
2.访问数组元素
访问数组中指定下标元素
获取指定下标元素
document.write(arr[1]);//获取数组中指定下标元素
修改指定下标元素
要修改的元素=修改后内容;
arr[2] = "李四";//修改数组中指定下标元素
3.数组的遍历
for (var i = 0; i < arr.length; i++) {
console.log(arr1[i]);
}
- 数组.length:返回数组长度
4.练习
定义一个数组存储5个随机范围[5,10]的整数,求数组中的最大值及其下标
分析:假设最大值为0,遍历数组,依次比较大小,将比最大值大则赋值给最大值。根据得到的最大值与数组元素进行比较,进而得出下标。
var arr = [];//定义一个空数组
var max = 0;
for (var i = 0; i < 5; i++) {
arr[i] = Math.floor(Math.random() * 6 + 5);//数组中若不存在指定下标元素,此时数组会自动创建该下标
if (arr[i] > max) {
max = arr[i];
}
}
document.write(arr1);
document.write(max);
for (var i = 0; i < 5; i++) {
if (arr1[i] == max) {
console.log("最大值下标为:" + i);
}
}
二、二维数组
概念:数组中每一个元素仍是一个一维数组,此时该数组被称为二维数组。
1.定义
var arr = [[],[],[]];
var arr = [];
for (var i = 0; i < arr.length; i++) {
arr[i] = [];
}
2.遍历
双层for循环实现,外层循环控制二维数组中一维数组下标,内层循环控制一维数组内部的元素下标。
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr.length; j++) {
console.log(arr[i][j]);
}
}
3.练习
定义一个3行3列的二维数组,随机存储[5,10]的数字,并求最大值及其下标。
var arr = [];//定义一个数组
var max = 0;
for (var i = 0; i < 3; i++) {
arr[i] = [];//在二维数组中下标为i的位置添加一维数组
for (var j = 0; j < 3; j++) {
arr[i][j] = Math.floor(Math.random() * 11 + 10);
if (arr[i][j] > max) {
max = arr1[i][j];
}
}
}
console.log(arr1);
console.log("最大值为:" + max);
//查找最大值位置
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
if (arr[i][j] == max) {
console.log("最大值下标为:" + i + " " + j);
}
}
}
三、数组内置操作
1.新增数组元素
- 数组.push()向数组中所有内容后边添加一个元素
arr.push("张三");
- 数组.unshift()向数组中所有内容最前面添加一个元素
arr.unshift("张三");
- 数组.splice()向数组中任意位置添加元素 数组.splice(index,num,val1,val2,…)
index:数组操作的起始下标
num:要删除的数组元素数量
val1,val2,…:要插入的数据
arr.splice(2, 0, "张三");
2.删除数组元素
- 数组.pop()删除数组中最后一个位置的元素
arr.pop();
- 数组.shift()删除数组中开头位置元素
arr.shift();
- 数组.splice()删除数组中任意位置元素
arr.splice(0,1);
3.查看数组中是否存在给定元素
数组.indexOf(item):从数组中查找item数据,如果存在则返回item数据的下标,不存在则返回-1
var arr = ["张三", 2, 3, 5, "张三"];
console.log(arr.indexOf("张三")); //若有多个相同,则只返回第一个位置下标,不存在返回-1
应用:去除一组数据中重复数字
定义一个含有10个数值在范围[5,10]的随机数组,并去除组中重复数字
分析:去重,新建一个数组,遍历要去重数组,判断新数组中是否有该元素,没有则存入新数组。
var arr1 = [],
arr7 = [];
//生成一组随机整数数组
for (var i = 0; i < 20; i++) {
arr1[i] = Math.floor(Math.random() * 91 + 10);
}
// 去重 新建一个空数组,遍历要去重数组,将数组存入新数组,存放前判断新数组中是否有该元素,没有则存入
for (var i = 0; i < arr1.length; i++) {
if (arr7.indexOf(arr1[i]) == -1) {
// arr7中不存在对应随机数
arr7.push(arr1[i]);
}
}
document.write("去重后为:" + arr7);
4.数组切片(从数组中截取一部分)
数组.slice():从数组中指定位置开始连续提取若干个元素并且提取的元素以新数组形式返回。
var arr = ["张三", 2, 3, 5, "张三"];
var result = arr.slice(1, 3); //下标为1截至到下标为3,不包括3
- 数组.slice(start,end)从start下标位置开始切片,到end-1位置结束。若只有一个参数,默认从下标开始切到结尾。
- slice进行数组切片时,会将切片的元素以新数组形式返回,不影响原数组内容。
5.数组的拼接
数组.concat(arr1,arr2,…)
var arr1 = [1, 2, 3];
var arr2 = ["张三", "李四"];
var arr3 = arr1.concat(arr2);
四、冒泡排序
- 冒泡排序:从第一个数开始,两个数依次比较,较大者依次向后排,每一趟选出一个最大值。
- 冒泡排序需要一个双层for循环结构,外层控制比较趟数,内层控制循环比较次数。
var arr1 = [2,4,5,2,1];
// 外层循环控制比较趟数
// 外层-1可省,只是多比较一次,会影响排序效率
for(var i=0;i<arr1.length-1;i++){
// 内层循环控制比较次数
for(var j=0;j<arr1.length-1-i;j++){
// 内层-1不可省略 可能会造成数组越界
if(arr1[j]>arr1[j+1]){
var temp=arr1[j];
arr1[j]=arr1[j+1];
arr1[j+1]=temp;
}
}
}
console.log(arr1);
数组内置的冒泡排序算法
function(){}提供比较
var arr2=[100,20,3,23,40];
// sort默认比较字符串
arr2.sort(function(item1,item2){
return item1-item2;
});//升序排序,其中item1,item2可以是任意变量名
arr2.sort(function(item1,item2){
return item2-item1;
}); //降序排序
var arr2=[100,20,3,23,40];
arr2.sort(function(item1,item2){
return item2-item1;
}); //降序排序