目录
一、数组
1. 概念
数组是类型相同的数据的集合。
2. 创建数组
2.1 使用'[]'创建
var 变量名 = []; //可以创建空数组
var 变量名 = [1,2,3,4]; //创建一个有数据的数组
2.2 使用 'new Array'创建
var 变量名 = new Array(); //创建一个空数组
var arr4 = new Array(1, 2, 3, 4); //创建一个有数据的数组
// 2.创建数组
var arr1 = []; //创建一个空数组
var arr2 = [1, 2, 3, 4, 5]; //创建一个有数据的数组
var arr3 = new Array(); //创建一个空数组
var arr4 = new Array(1, 2, 3, 4); //创建一个有数据的数组
3. 数组的属性
length:数组默认属性,表示数组的长度。
// 3.数组的length属性
console.log(arr3.length)
console.log(arr4.length)
4. 数组元素的访问
数组名[index]
'index'的取值在0~length-1。
// 4.数组元素的访问
console.log(arr4);
for (var i = 0; i < arr4.length; i++) {
console.log(arr4[i]);
}
5.示例
案例:找出一个数组的最大值
var arr = [45, 12, 35, 78, 99, 466, 231]; var max = arr[0]; //假定数组的第一个数是最大值 for (var i = 1; i < arr.length; i++) { if (max < arr[i]) { //把数组之后的每一个数跟MAX数比较 max = arr[i]; //更新MAX值 } } console.log("Max:", max); console.log("原数组:", arr);
案例:反转数组中的元素
var arr = [45, 12, 35, 78, 99, 466, 231]; // 错误代码:交换到一半其实就换完了,继续交换下一半又会换回去 // for (var i = 0; i < arr.length; i++) { // var temp = arr[i]; // arr[i] = arr[arr.length - i - 1]; // arr[arr.length - i - 1] = temp; // } // console.log("交换后:", arr); //输出:[45, 12, 35, 78, 99, 466, 231] // 正确代码:方法一 for (var i = 0; i < parseInt(arr.length / 2); i++) { var temp = arr[i]; arr[i] = arr[arr.length - i - 1]; arr[arr.length - i - 1] = temp; } console.log("交换后:", arr); //输出:[45, 12, 35, 78, 99, 466, 231] // 正确代码:方法二 var i = 0; var j = arr.length - 1; while (i < j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } console.log("交换后:", arr); //输出:[45, 12, 35, 78, 99, 466, 231]
案例:已知数组(12,23,26,45,58,60)是有序的,输入一个数X,将他插入到数组中,保证数组仍然是有序的
// 题目:已知数组(12,23,26,45,58,60)是有序的,输入一个数X,将他插入到数组中,保证数组仍然是有序的 var arr=[12,23,26,45,58,60,null] var num=parseInt(prompt('请输入一个整数')) var index=0 //插入位置的索引 //1.遍历数组,寻找插入的位置 for(var i=0;i<arr.length;i++){ if(arr[i]>num){ index = i; break } } //2.将插入位置以后的元素依次向后移动 for(var j=arr.length-1;j>index;j--){ arr[j]=arr[j-1] } //3.将元素放入相应的位置 arr[index] = num console.log(arr)
6. for...in循环
专门用来遍历数组或集合的。
变量中存放的数组或集合的索引。
for(var 变量 in 数组名或集合名) //变量中存放的数组或集合的索引
{
数组名[变量]
}
var arr = [45, 12, 35, 78, 99, 466, 231];
for(var k in arr){
console.log(k); //输出索引:0,1,2,3,4,5,6
}
for(var k in arr){
console.log(arr[k]); //输出元素:45, 12, 35, 78, 99, 466, 231
}
7. for...of循环
专门遍历数组和集合。
变量中存放的是数组或集合中的元素。
遍历数组和集合的效率最高,但是无法遍历对象。
for(var 变量 of 数组名或集合名) //变量中存放的是数组或集合中的元素
{
console.log(变量);
}
var arr = [45, 12, 35, 78, 99, 466, 231];
for (var k of arr) {
console.log(k); //输出元素:45, 12, 35, 78, 99, 466, 231
}
8. forEach循环
函数中不能有return和break语句。
arr.forEach(function(k) //依次从数组中取出元素放在k中,然后将k作为参数传递给函数
{console.log(k);
})
var arr = [45, 12, 35, 78, 99, 466, 231];
arr.forEach(function (k) {
console.log(k); //输出元素:45, 12, 35, 78, 99, 466, 231
})
二、二维数组
1. 概念
二维数组指一个数组元素带有两个下标(有行有列)
2. 二维数组的创建
2.1 使用'[]'
var arr = [[1,2,3],[4,5,6],[7,8,9]]; //3行3列的二维数组
2.2 使用'new Array'
var a = new Array(
new Array(10,20,30),
new Array(11,22,33),
new Array(45,56,67)
)
var arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] //3行3列的二维数组
var a = new Array(
new Array(10, 20, 30),
new Array(11, 22, 33),
new Array(45, 56, 67)
)
// 转换成字符串输出
var str = ''
for (var i = 0; i < a.length; i++) { //外循环:a.length表示二维数组的行数
for (var j = 0; j < a[i].length; j++) { //内循环:a[i].length表示i行的元素个数(列数)
str += a[i][j] + '\t'
}
str += '\n'; //在每行的末尾添加换行符
}
console.log(str);
3. 二维数组元素的访问
数组名[行下标][列下标] //按行优先访问,默认按行优先
数组名[列下标][行下标] //按列优先访问
4. 例题
案例:二维数组的转置
分析:行变成列,列变成行。
注意:行列相同的二维数组(矩阵)和行列不同的二维数组转置的区别。
var a = [ ['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['i', 'k', 'I'] ] var str = '' for (var i = 0; i < a.length; i++) { for (var j = 0; j < a[i].length; j++) { str += a[i][j] + '\t'; } str += '\n'; } console.log("转置前:\n", str); var res = [] //临时用于转置的数组 for (var i = 0; i < a[0].length; i++) { //外循环:变量i是a数组的列下标,也是res数组的行下标 res[i] = [] for (var j = 0; j < a.length; j++) { //内循环:变量j是a数组的行下标,也是res数组的列下标 res[i][j] = a[j][i]; } } console.log("转置后:", res);
案例:求3*4的二维数组的所有元素之和
var arr=[ [12,25,4,59], [11,33,41,26], [22,87,5,17] ] console.log(arr) // 所有元素之和 var sum = 0; for(var i=0;i<arr[0].length;i++){ //外循环:表示行下标 for(var j=0;j<arr.length;j++){ //内循环:表示列下标 sum += arr[j][i] } } console.log(sum)
案例:求3*4的二维数组的每行元素之和
var arr=[ [12,25,4,59], [11,33,41,26], [22,87,5,17] ] console.log(arr) // 每行元素之和 for(var i=0;i<arr.length;i++){ //外循环:表示行下标 var sum = 0; for(var j=0;j<arr[i].length;j++){ //内循环:表示列下标 sum += arr[i][j] } console.log('第'+(i+1)+'行元素之和= ',sum) }
案例: 求3*4的二维数组的每列元素之和
var arr=[ [12,25,4,59], [11,33,41,26], [22,87,5,17] ] console.log(arr) // 每列元素之和 // arr[0].length:第一行的长度,4 for(var i=0;i<arr[0].length;i++){ //外循环:表示列下标 var sum = 0; //arr.length:行数,3行 for(var j=0;j<arr.length;j++){ //内循环:表示行下标 sum += arr[j][i] //[0][0],[1][0],[2][0];[0][1],[1][1],[2][1];[0][2],[1][2],[2][2] } console.log('第'+(i+1)+'列元素之和= ',sum) }
案例:求3*3的二维数组的对角线元素之和
var a=[ [1,2,3], [4,5,6], [7,8,9] ] var s1=0,s2=0; for(var i=0;i<a.length;i++){ s1 += a[i][i]; s2 += a[i][a.length-i-1] } console.log('左上-右下对角线元素之和=',s1) console.log('左下-右上对角线元素之和=',s2)
案例:输出杨辉三角
// 定义二维数组 var info=new Array(7) //创建一个数组,有7个单元 for(var i=0;i<info.length;i++){ info[i] = new Array(7) //在数组的每个单元里,再创建一个7单元的数组,构成二维数组 } //1.对二维数组进行初始化:第一列和对角线元素全部置为1 for(var j=0;j<info.length;j++){ info[j][j] = 1; //对角线元素为1 info[j][0] = 1; //第一列元素为1 } //2.对二维数组正对角线左边的元素进行运算 for(var i=2;i<info.length;i++){ //外循环:行下标 for(var j=1;j<i;j++){ //列下标 info[i][j]= info[i-1][j-1]+info[i-1][j] } } //3.输出二维数组 var str='' for(var i=0;i<info.length;i++){ for(var j=0;j<=i;j++){ str +=info[i][j]+'\t' } str += '\n' } console.log(str)