Day14
●js数组
为什么需要数组呢?
王大爷有六只乌龟,它们的体重分别是3Kg, 5Kg, 1Kg, 3.4Kg, 2Kg, 50Kg,请问这六只乌龟的总体重是多少?平均体重是多少?请你用现在掌握的技术编一个程序解决。
如果使用传统的方法来解决这个问题,就要定义6个变量,那么如果王大爷养的不是6只,而是600只呢?所以说这种方法很麻烦。
à故解决方法:要用数组!
使用数组这种数据类型(复合类型/复杂类型/引用类型)。
数组的基本概念:用于存放一组数据
Javascript中数组的特点:不区分数据类型!即它可以存放各种类型(数值,字串)。
●一维数组
基本用法:
Var 数组名 = [元素值,元素值,…];\;
特别说明:元素的值可以是任意类型。
var arr =[1,45,”hello world”,true];
王大爷养乌龟问题:
<html>
<head>
<script language="javascript">
var weights = [3,5,1,3.4,2,50];//有整数,有小数,都可以
var all_weight =0;
var avg_weight =0;
for(var i =0;i < weights.length;i++){
document.writeln(weights[i]+" ");
all_weight += weights[i];
}
avg_weight=all_weight/weights.length;
//平均体重保留两位小数
document.writeln("总体重是"+all_weight+"平均体重是"+avg_weight.toFixed(2));
</script>
</head>
<body>
</bod>
</html>
(1)数组在内存中的存在形式:
(2)数组在js中也是引用传递
案例:
<html>
<head>
<script language="javascript">
var myval = 900;
function abc(val){
val =90;
}
abc(myval);
window.alert(myval); //这里输出900,因为不是引用传递
var myarr=[456,90,900];
function abc2(arr){
arr[0] = 35;
}
abc2(myarr);
for(var i=0;i<myarr.length;i++){
document.writeln(myarr[i]);
}
</script>
</head>
<body>
</body>
</html>
分析图:
(3)数组的引用
数组名[下标],下标也是从0开始的。
那么当你访问一个越界的值时候,会报什么错误?
àundefined
结论:不能访问不存在的元素。
(4)js中的数组可以动态增长!---与其他语言有很大区别。
var a=[1,2];
alert(a.length);
a[2]=4; //数组长度增加了
alert(a.length);
alert(a[2]);
(5)js数组的几个重要应用
☞使用数组名.length可以获得数组的长度
☞使用split可以将一个字串截取成数组,与java中的spilt一样
var string="My name is Gavin";
var name=string.split(" ");
document.writeln(name);// 输出My,name,is,Gavin
(5)遍历数组的另一种方式
举例:
arr=[12,34,5];
arr['gg']=9000;//下标不一定是数字—>了解即可
for(var key in arr){
alert(key+"= "+arr[key]);
}
★一维数组小结
▶数组可以存放任意类型的数据
▶数组大小不必事先指定,可以动态增长
▶数组名可以理解为指向数组首地址的引用
▶数组元素从0开始编号
●多维数组—二维数组
一维数组的元素还可以是一个数组,就构成了二维数组
实例:var arr =[[1,2,3],[“你好”.23,false]];
看看如何遍历二维数组
☞应用:二维数组的转置
//矩阵的转置
var arr=[[2,4,6,8],[8,9,0,-1],[9,6,2,1]];
//定义一个新的数组
var arr2=[];
//初始化 定下新的数组有多少行
for(var i=0;i<arr[0].length;i++){
arr2[i] = [];
}
//可以动态添加数据了
//遍历旧的数组
for(var i=0;i<arr.length;i++){
for(var j =0;j<arr[i].length;j++){
arr2[j][i] = arr[i][j];
}
}
for(var i=0;i<arr2.length;i++){
for(var j=0;j<arr2[i].length;j++){
document.writeln(arr2[i][j]+" ");
}
document.writeln("<br/>");
}
●js语法—排序
冒泡:
//冒泡排序
var flag = false;//优化设置
var arr=[5,0,-56,900,12,45,67,45,34,784];
// var arr=[1,2,3,4,5,6];
for(var i =0;i<arr.length-1;i++){
document.writeln("大循环...");//看一下优化效果
for(var j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
//交换
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = true;
}
}
if(flag == true){
flag = false;
}else {
break;
}
}
//打印
for(var i =0;i<arr.length;i++){
document.writeln(arr[i]+" ");
}
●js语法—查找
二分查找:前提是数组是有序的,若不是有序的,则不能使用二分查找。
//二分查找
var arr=[1,2,4,5,6,7,8,9,34,23,78];
binarySearch(arr,7,0,arr.length-1);
//思路;找到数组中间的数(midVal),和你要查找的数(findVal)进行比较,如果
//midVal>findVal,则说明findVal在数组的左边,就把该数组二分,继续在
//左半边查找,在左边继续二分。
function binarySearch(arr,findVal,leftIndex,rightIndex){
//找到中间的值,一定要下取舍,因为javascript不会自动取整
var midIndex = Math.floor((leftIndex+rightIndex)/2);
var midVal=arr[midIndex];
//进行查找有一个前提,防止是无穷递归
if(leftIndex>rightIndex){
document.writeln("找不到");
return;
}
//比较
if(midVal>findVal){
//在左边找
binarySearch(arr,findVal,leftIndex,midIndex-1);
}else if(midVal<findVal){
//在右边找
binarySearch(arr,findVal,midIndex+1,rightIndex);
}else{
document.writeln("找到了,下标为"+midIndex);
return;
}
}