js基础 数组(一)

一、数组概述
程序 = 数据 + 算法
所谓的数据结构,就是把数据和数据之间的关系按照特定的结构来保存。
数组就是一种特定形式的数据,是数据的集合 

二、创建数组
(1)数组字面量

var names = ['Tom','Jerry'];

(2)构造函数

var names = new Array(3);    //创建一个数组,有3个数组元素
var names = new Array('Tom','Jerry');  //创建数组,然后初始值

(3)数组元素的访问
数组中每一个元素默认都有下标,是从0开始
访问数组,就可以通过下标
数组[下标] 如:names[0] 

练习:创建一个数组country,初始化5个数组元素,修改第3个数组元素的值,打印第4个数组元素对应的值及数组

var country = ['中国','韩国','美国','日本','德国'];
country[2] = '英国';
console.log(country[3]);  //日本
console.log(country);    // [ '中国', '韩国', '英国', '日本', '德国' ]

(4)数组的长度
length 属性可以获取数组的长度,使用length还可以往数组的最后添加元素。

var country = ['中国','韩国','美国','日本','德国'];
country[2] = '英国';
console.log(country[3]);
console.log(country);
//查看数组中元素的个数
console.log(country.length);
//往数组中添加元素
country[country.length] = '荷兰';
country[country.length] = '阿根廷';
console.log(country);   //[ '中国', '韩国', '英国', '日本', '德国', '荷兰', '阿根廷' ]

三、对比null 和undefined
相同点:都是原始类型的数据,保存在栈内存中。
不同点:
undefined:表示当一个变量声明未赋值;声明函数,没有返回值或者返回值为空;访问对象中不存在的属性;访问数组中不存在的元素;
null:本来一个变量指向引用类型的数据,赋值为null断开所指向的引用类型;称为释放对象的引用。

//数组的存储
var arr = ['张飞','刘备','关羽'];
var arr2 = arr;
arr2[0] = 'dandan';  //改变arr2中的值
console.log(arr[0]);  //dandan
//当前arr和arr2同时指向同一个数组
arr = null;  //释放变量,改变变量的指向。
console.log(arr);    //null
console.log(arr2);   //[ 'dandan', '刘备', '关羽' ]
arr[0]='dandan';
console.log(arr);    //报错

四、遍历数组
(1)for-in

for(var proName in arr){
  //proName 数组元素的下标
  //arr[proName] 数组中的每一个元素
};

数组也是一种对象,可以称为数组对象。

练习:创建一个函数,形参为空,调用函数的时候,传递若干个实参,返回实参相加的结果

//创建一个函数,形参为空,调用函数的时候,传递若干个实参,返回实参相加的结果。
function fn(){
//arguments:将传入的实参转换成对象{ '0': 2, '1': 3, '2': 4, '3': 5 }
//等同于arguments={ '0': 2, '1': 3, '2': 4, '3': 5 }
	//console.log(arguments);   // //打印传入的实参{ '0': 2, '1': 3, '2': 4, '3': 5 }
//遍历arguments
	var sum = 0;
	for(var proName in arguments){
//打印属性值(proName表示传入实参组成的数组(arguments)的下标)
		//console.log(arguments[proName]);
		sum += arguments[proName];			
};
	return sum;	
};
var res = fn(1,2,3,4,5);
console.log(res);

(2)for循环,遍历的是数组元素的下标

for(var i=0;i<arr.length;i++){
  //i 数组的下标
  //arr[i] 数组的元素
};

练习:创建一个数组保存一个员工的信息,包括编号,姓名,性别,生日,薪水,电话;使用for循环遍历员工的所有信息。

var emp = [1,'Tom','男','1993-10-14',9000,'13758546232'];
//方法一:
for(var i=0;i<emp.length;i++){
	console.log(emp[i]);
//方法二:
for(var key in emp){
     console.log(emp[key]);
};

五、数组的分类
数组分为关联数组索引数组
 索引数组:以数值作为下标的 

//索引数组
var arr1 = ['张飞','关羽','马超'];
arr1[3] = 'dandan';   //使用数字下标
console.log(arr1);   //[ '张飞', '关羽', '马超', 'dandan' ]

关联数组:以字符串作为下标的,只能使用for-in来遍历数组

//关联数组
var arr2 = new Array();
arr2['name'] = 'dandan';    //使用字符串
arr2['age'] = 20;
console.log(arr2);          //[ name: 'dandan', age: 20 ]
for(var key in arr2){
	console.log(key + ':' + arr2[key]);  
};
//遍历数组结果
name:dandan
age:20

练习1:声明函数,在函数中传递参数(数组),获取传递的数组中的最大值。

function getMax(arr){
//假设第一个数组元素为最大值
	var max = arr[0];
	for(var i=0;i<arr.length;i++){
//两两比较,拿max与所有的数组元素进行比较
		max = max>arr[i] ? max :arr[i]
};
	return max;
};
var res = getMax([23,33,79,15,80]);
console.log(res);   //80

练习2:声明函数,传递参数为数组,获取最小值,并返回

function getMin(arr){
	var min = arr[0];
	for(var i=0;i<arr.length;i++){
		min = min < arr[i] ? min : arr[i];
};
	return min;
};
var res = getMin([23,33,79,15,80]);
console.log(res);  //15

练习3:声明函数,传递两个参数(参数1:数组,参数2:值),返回值在数组中的位置

function getIndex(arr,value){
	for(var i=0;i<arr.length;i++){
		if(arr[i]==value){
			return i;     //存在传入的实参值,返回值在数据中的位置
};
	};
		return -1;        //不存在,返回-1
		}; 
var res = getIndex([5,20,18,13,72],18);
console.log(res);           //2

练习4:对数组进行由小到大的排序(冒泡排序,非常重要)
[90,32,57,49,80]--->[32,49,57,80,90]

var arr = [90,32,57,49,80];
//外层循环控制的是循环轮数
for(var i=1;i<arr.length;i++){
  //内层循环控制的是每一轮的次数
  //1---4
  //2---3
  //3---2
  //4---1
  for(var j=0;j<arr.length-i;j++){
  //j前面的元素的下标
    //j和下个元素比较
    if(arr[j]>arr[j+1]){
      var tmp = arr[j];
      arr[j] = arr[j+1];
      arr[j+1] = tmp;
    };
  };
};
console.log(arr);    //[ 32, 49, 57, 80, 90 ]

六、数组对象的方法(API)

 API(Application Programming Interface)
-- toString() 将数组转换成字符串
-- join() 将数组转为字符串,可以按照指定的格式拼接数组元素
-- cancat 拼接两个或者更多的数组
-- slice() 截取数组
-- splice() 修改数组(删除,替换,插入),返回的是删除的数组元素
-- reverse() 翻转数组
-- sort 数组排序
--push 在数组的最后添加元素
-- pop 删除数组的最后一个元素 

(1)toString() 将数组转换成字符串

var arr = [1,3,8,7,9];
var res = arr.toString()
console.log(res);     //1,3,8,7,9

(2)join() 将数组转为字符串,可以按照指定的格式拼接数组元素

var arr = [1,3,8,7,9];
var res = arr.join('|');
console.log(res);     //1|3|8|7|9

(3)cancat 拼接两个或者更多的数组

var arr = [1,3,8,7,9];
var arr1 = [2,5,6];
var arr2 = [10,11,12];
var res1 = arr.concat(arr1);
var res2 = arr.concat(arr1,arr2);
console.log(res1);   //[ 1, 3, 8, 7, 9, 2, 5, 6 ]
console.log(res2);   //[ 1, 3, 8, 7, 9, 2, 5, 6, 10, 11, 12 ]

(4)slice() 截取数组

var arr = [1,3,8,7,9];
var res = arr.slice(2);  
console.log(res);     //[ 8, 7, 9 ]
var res1 = arr.slice(2,3);  
console.log(res1);    //[ 8 ]2表示开始的下标,3表示结束下标 ,不包含结束本身。
var res2 = arr.slice(-5);  
console.log(res2);    //[ 7, 9 ]倒数截取

(5)splice() 修改数组(删除,替换,插入),返回的是删除的数组元素

var arr = [1,3,8,7,9];
//删除
//var res = arr.splice(2);
//console.log(res);   //[ 8, 7, 9 ]
//console.log(arr);   //[ 1, 3 ]
//第一个参数删除开始的下标,第二个参数是删除的个数
//var res1 = arr.splice(2,1);
//console.log(res1);  //[ 8 ]
//console.log(arr);   //[ 1, 3, 7, 9 ]
//替换
//var res2 = arr.splice(2,2,10);  //用10替换删除的两个元素8,7
//console.log(res2);  //[ 8, 7 ]
//console.log(arr);   //[ 1, 3, 10, 9 ]
//插入
var res3 = arr.splice(2,0,10);  //用10替换删除的两个元素8,7
console.log(res3);   //[]
console.log(arr);  //[ 1, 3, 10, 8, 7, 9 ]

(6)reverse() 翻转数组

var arr = [1,3,8,7,9];
var res = arr.reverse();   //改变arr数组
console.log(arr);        //[ 9, 7, 8, 3, 1 ]

(7)sort 数组排序

var arr1 = ['北京',10,'abc',56,32];
//默认
arr1.sort();          //改变数组,默认采用Unicode码进行排序
console.log(arr1);   //[ 10, 32, 56, 'abc', '北京' ]

//升序
var arr = [1,3,8,7,9];
arr.sort(function(a,b){
  return a-b;       //从小到大
});
console.log(arr);    //[ 1, 3, 7, 8, 9 ]

降序
var arr = [1,3,8,7,9];
arr.sort(function(a,b){
  return b-a;       //从大到小
});
console.log(arr);    //[ 9, 8, 7, 3, 1 ]

(8)push push 在数组的最后添加元素

var arr = [1,3,8,7,9];
arr.push(60);
console.log(arr);  //[ 1, 3, 8, 7, 9, 60 ]

(9)pop 删除数组的最后一个元素

var arr = [1,3,8,7,9];
arr.pop(60);
console.log(arr);  //[ 1, 3, 8, 7 ]

练习:创建一个数组,包含若干个员工(对象)的信息,每一个员工具有编号,姓名,性别,生日,工资,电话等属性,使用for-in遍历数组及对象,对象成一行展示。

var arr = [
person1 ={id:1,name:'Tom',gender:'男',birthday:'1993-10-14',salary:8000,tel:'18269856321'},
person2 ={id:2,name:'Jerry',gender:'女',birthday:'1994-01-04',salary:5000,tel:'18369853245'},
person3 ={id:4,name:'Alice',gender:'女',birthday:'1992-11-20',salary:10000,tel:'15236212589'}
];
for(var key in arr){
  var str = '';
  for(var proName in arr[key]){
  str += arr[key][proName]+'  ';
  };
console.log(str);
};

//最终输出
1  Tom  男  1993-10-14  8000  18269856321
2  Jerry  女  1994-01-04  5000  18369853245
4  Alice  女  1992-11-20  10000  15236212589

思考:对比使用for-in遍历对象和遍历数组

//遍历对象
for(var proName in emp){
  //proName  所要遍历的属性名
  //emp  要遍历的对象
  //要通过属性名proName访问属性值--->emp[proName]
};
注意:使用for-in只能遍历对象中自定义的属性,不能遍历预定义(对象本身自带)的属性。


//遍历数组
for(var proName in arr){
  //proName 数组元素的下标
  //arr[proName] 数组中的每一个元素
};
上一篇: js基础 对象
下一篇: js基础 函数相关练习题(一)
作者邮箱: 203328517@qq.com