Array数组
1数组的定义
一系列数据的集合,每一项可以保存任何类型的数据,称为数组的元素,每个元素之间用逗号隔开,数组格式:[1,2,3]。
2数组的创建方式
2.1字面量(直接量)(推荐)
var arr = [1,2,3];
2.2使用构造函数创建
var arr = new Array();//创建一个空数组;
var arr = new Array(7);//创建一个长度为7的数组(数组项都为undefined);
var arr = new Array('王大锤',18 ,'普通青年','广州');//创建数组并同时写入数据。
3数组的操作
数组的操作主要包括,读取、写入、遍历。
3.1读取
索引值,从0开始,最后一项arr[arr.length-1];属性length表示数组元素的数量。
3.2写入
var arr = [10,20,30];
arr[0] = 100; 将arr的第一个数组元素(索引值为0)更改为100。
arr[3] = 400; 在数组后添加一个400;
或 arr[arr.length]=400; 这个为通用法,在一个数组的最后添加一个元素。
3.3遍历
获取所有数组元素
for(i = 0; i < arr.length; i++){
document.write = arr[i] + ‘<br />’
} //将所有的数组元素打印出来
4数组的方法
数组的操作主要可以分为4类,增、删、查(读取)、改。
4.1增加数组元素
4.1.1 unshift在数组前面添加数组元素
arr.unshift(9,8....); 可以在最前面加一个或多个数组元素。
var arr = [10,20,30];
var res = arr.unshift(8,9); 此时console.log(res);其值为5,arr.unshift返回值为数组的长度。
4.1.2 在数组最后增加数组元素
1. 使用arr[arr.length];
2. arr.push();其返回值为数组长度。
4.2删除数组元素
4.2.1 pop()删除最后一个数组元素
arr.pop(); 圆括号内必须为空,为删除。其返回值为删除掉的元素。
4.2.2 shift()删除第一个数组元素
返回值为删除掉的元素。
4.2.3 splice();在数组中插入、删除、替换的通用方法
splice(start, deleteNum, ...items);
start:起始索引位置;
deleteNum:要删除的数量;
items:插入的元素(可以是多个)。
返回值为删除掉的元素。
如var arr2 = [10, 20, 30]; arr2.splice(1,1)从索引值1开始删除掉一个元素,所以删除元素为20。
添加时,arr2.splice(2,0,25); 效果为在20和30之间插入25,此处索引值为2,不能是1,可以理解为插入元素时,为在该索引值处的前面添加数组元素。
替换,arr2.splice(2,0,40);效果为将30变为40,返回值为30。
splice的返回值由删除元素组成的数组。
4.3 join()
join(separator) 返回字符串值,其中包含了连接到一起的数组的所有元素;
separator为分隔符,默认为逗号。
var arr = [lilei,wangmeimei,hehe];
document.write=(arr.join(‘,’));
效果为显示: lilei,wangmeimei,hehe
4.4 concat()
concat() 返回一个新数组,这个新数组是由调用这个方法的数组和参数组成
参数可以是多个。
5 数组排序
5.1冒泡排序法
/*
冒泡排序
两两进行判断,把最大的值移动到最后
[10,2,8,55,32,18,9,11,30,16,19,20]
*/
var arr = [10,2,8,55,18,32,9];
document.write('<h4>' + arr.join() + '</h4>');
// 外层循环:执行多次内循环
for(var j=0;j<arr.length-1;j++){
// 内层循环:把最大值移动到最后
for(var i=0;i<arr.length-j-1;i++){
if(arr[i] > arr[i+1]){
// 如果当前数字比后面的数字大
// 则交换位置
var temp = arr[i];//10
arr[i] = arr[i+1];//2
arr[i+1] = temp
}
document.write('<p>' + arr.join() + '</p>');
}
document.write('<p class="complete">内循环'+(j+1)+'次:'+ arr.join() + '</p>');
}
console.log(arr);
5.2选择排序法
/*
选择排序法
把当前数字分别跟后面的数字进行对比,把最小的放前面
[10,2,8,55,32,18,9,11,30,16,19,20]
*/
var arr = [10,2,8,55,18,32,9];
// 外层循环
for(var i=0;i<arr.length;i++){
// 注意变量初始化的值
for(var j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
console.log(arr);
5.3快速排序法
选择排序法
把当前数字分别跟后面的数字进行对比,把最小的放前面
[10,2,8,55,32,18,9,11,30,16,19,20]
*/
var arr = [10,2,8,55,18,32,9];//[10,2,8,18,32,9] 55 []
function fastSort(arr){
// 递归退出条件
if(arr.length<=1){
return arr;
}
var centerIdx = parseInt(arr.length/2);
var center = arr[centerIdx];//8
// 保存比中间的数小的值
var left = [];
// 保存比中间数大的值
var right = [];//[10,9]
for(var i=0;i<arr.length;i++){
if(arr[i]<center){
left.push(arr[i]);
}else if(arr[i]>center){
right.push(arr[i]);
}
}
return fastSort(left).concat(center,fastSort(right));
}
5.4 sort()数组自带排序法
/*
数组自带排序方法
[10,2,8,55,32,18,9,11,30,16,19,20]
sort()
* 参数:函数
*/
var arr = [10,2,8,55,32,18,9,11,30,16,19,20];
var res = arr.sort(function(a,b){
/*
如果函数返回正数:说明a>b
如果函数返回负数:说明a<b
如何函数返回0: 说明a==b
*/
// if(a>b){
// return 1
// }eles if(a<b){
// return -1;
// }else{
// return 0
// }
return a-b;
});
console.log(res);
res.reverse();//反序排列
6 数组的复制
var num = 100;
var res = num;//res:100
res = 110;
// 那么num的值会不会变?
// num被复制
console.log(res,num); 此时不论res如何更改赋值,num的值都不会变化。
而数组这样复制时,
var arr = [10,20,30];
// 复制了快捷方式
var arr_res = arr;
arr_res.push(40);
console.log('arr_res:',arr_res);
console.log('arr:',arr);
arr_res变化时,arr也会跟着变化,这与计算机内存的栈内存和堆内存有关,如果想实现数组的复制,一般有两种方法。
6.1 遍历复制数组
// 实现数组的复制
var arr = [10,20,30];
// 复制方式1:
// * 先创建一个空数组
// * 遍历数组,逐个写入新数组
var newArr1 = [];
for(var i=0;i<arr.length;i++){
newArr1[i] = arr[i];
}
6.2 slice()复制数组
slice(start[,end]):返回数组的片段或子数组,从start开始到end(不包括end所对应的元素),如果省略end参数,则截取到数组的最后一项。
end也可以为负数,为-1时指倒数第一个数组元素。
// 方式2:
// 利用数组方法slice()
var newArr2 = arr.slice(0);
newArr2.unshift(9);
console.log(arr,newArr2);