(一)、数组概念
一系列数据的集合,每一项可以保存任何类型的数据,称为数组的元素,每个元素之间用逗号隔开
备注:数组格式:[1,2,3]
(二)、数组创建方式
1、字面量声明(var arr=[1,2,3]);推荐使用
2、使用构造函数创建
var arr = new Array();//创建一个空数组
var arr = new Array(7);//创建一个长度为7的数组(数组项都为undefined)
var arr = new Array('王大锤',18 ,'普通青年','广州');//创建数组并同时写入数据
(三)、数组的操作(增、改、查)
1、利用数组的索引,操作数组某个具体的元素。arr[idx]
2、数组的长度 arr.length
3、数组的遍历 for循环
格式:for(变量初始化;判断条件;变量更新){执行语句}
1 案例:script type="text/javascript"> 2 var arr = ["laotian","laoxie","laowang"]; 3 arr[3] = "lemon"; 4 arr[0] = "xiaotian"; 5 for(var i=0;i<arr.length;i++){ 6 console.log(arr[i]); 7 }
(四)、数组的方法
1、增删改 ==> 会改变原数组
(1.1)、push(item) ==> 后面添加
往数组尾部添加一个或多个元素,返回数组新的长度
(1.2)、unshift(item) ==> 前面添加
备注: 增加方法的返回值:数组的长度
往数组开头添加一个或多个元素,返回数组新的长度
(1.3)、pop() ==> 删除数组的最后一个元素
(1.4)、shift()删除数组的第一个元素
备注: 删除方法的返回值:被删除的那个元素
(1.5)、splice(idx,delNum,item[,item])
备注: splice方法的返回值:被删除的元素组成的数组
在数组中插入、删除、替换的通用方法
(1)splice的参数:
* idx 起始索引位置
* delNum 删除数组数量
* item 插入的元素(可以是多个)
(2)splice的作用:
* 删除元素 splice(idx,delNum)
* 添加元素 splice(idx,0,item)
* 修改元素 splice(idx,1,item)
2、数组的其他方法
(2.1)、slice(start[,end]) ==> 裁切数组
返回值为裁切数组中的某一部分组成的数组
(1) 从start开始到end(不包括end所对应的元素)
(2) end省略,代表裁剪到数组的最后一项
(3)支持负数(正数是从左往右(0-n)负数是从右往左(-1--n))
案例:
var arr = ["陈剑龙", "张聪聪", "熊家富", "张丰裕", "梁永昌", "徐明贵","吕运学","王乾坤", "何高峰", "彭琰"];
var res = arr.slice(-5,-2);
console.log(arr,res);
(2.2)join(分隔符) ==> 转为字符串
将数组拼接成字符串,返回值为拼接后的字符串
(1) 分隔符默认为逗号,也可以自己定义分隔符
案例:
var arr = ["陈剑龙", "张聪聪", "熊家富", "张丰裕", "梁永昌", "徐明贵","吕运学","王乾坤", "何高峰", "彭琰"];
output.innerHTML = arr.join("+");
(2.3)concat(数组1[,数组2]) ==>组合数组
返回一个新数组,这个新数组是由调用这个方法的数组和参数组成
案例:
var arr = [111,22,333];
var brr = [666,888,233];
var newArr = arr.concat(["aa","bb","vcc"],brr);
参数可以是多个
(2.4)reverse() ==> 颠倒顺序
将原数组中的元素颠倒顺序,返回倒序后的数组。
案例:
var arr = [111,22,666,888,333];
var crr = arr.reverse();
console.log(arr,crr);
console.log(arr,newArr);
(2.5)sort ==> 数组排序
备注:
1、将数组中的元素排序,返回值为排序后的数组
2、默认以字符串的排列方式(转换成ASCII码进行对比)
sort(function(a,b){return a-b;}) 从小到大
或
sort(function(a,b){return b-a;}) 从大到小
案例:
1 var arr = [111,22,666,888,333]; 2 var res = arr.sort(function(a,b){ 3 return b-a; 4 }); 5 console.log(arr,res);
(五)、数组排序(扩展)
1、冒泡排序
1、利用的是每一轮比较,当前索引与后一个索引进行值的比较
2、比较轮数为数组长度-1
1 案例:var arr = [12,3,44,343,55,1,23]; 2 for(var i = 1;i<= arr.length-1;i++){ 3 for(var j = 0;j < arr.length-1;j++){ 4 if(arr[j] > arr[j+1]){ 5 var cur = arr[j]; 6 arr[j] = arr[j+1]; 7 arr[j+1] = cur; 8 } 9 console.log(666); 10 } 11 }
2、选择排序法
1、把当前元素分别跟后面的元素对比
2、把最小的逐个往前排列
1 案例:var arr = [12,3,44,343,55,1,23]; 2 for(var i=0;i<arr.length-1;i++){ 3 for(var j = i+1;j<arr.length;j++){ 4 console.log(666); 5 if(arr[i] > arr[j]){ 6 var cur = arr[i]; 7 arr[i] = arr[j]; 8 arr[j] = cur; 9 } 10 } 11 } 12 console.log(arr);
3、快速排序(利用递归实现)
1 案例:var arr = [10, 8, 20, 5, 6, 30, 11,9]; 2 function fastsort(arr){ 3 // 当数组的长度小于等于1,就没有中间值,就没法比较,可以直接返回 // 4 if(arr.length <= 1){ 5 return arr; 6 } 7 // 1.找出中间索引 // 8 var centerIdx = parseInt(arr.length/2); 9 // 2.splice() 删除数组中的某个值,返回被删除的元素组成的数组 // 10 var centerItem = arr.splice(centerIdx,1)[0]; 11 // 3.定义dayuarr、xiaoyuarr,大于中间数就放在dayuarr里面,小于等于中间数就放在xiaoyuarr里面 // 12 var dayuarr = []; 13 var xiaoyuarr = []; 14 for(var i=0;i<arr.length;i++){ 15 if(arr[i]>centerItem){ 16 dayuarr.push(arr[i]); 17 }else if(arr[i]<=centerItem){ 18 xiaoyuarr.push(arr[i]); 19 } 20 } 21 return fastsort(xiaoyuarr).concat([centerItem],fastsort(dayuarr)); 22 } 23 var newArr = fastsort(arr); 24 console.log(newArr);
(六)、数组的传递及复制
1、传递 var brr = arr;
(1.1)、此时传递的是arr在堆中的地址给brr。所以一旦brr的值进行修改,arr也会受影响。
2、复制
(1.1)、for循环拷贝arr里面的每个元素
(1.2)、slice(start,end)截取数组,不影响原数组
1 案例: 2 var arr = [1,2,3]; 3 var brr = arr.slice(0); 4 brr[0] = "aa"; 5 console.log(arr,brr);
(七)、多维数组:数组套数组[[],[],[],....]
也可以用for循环在原有数组中增加
1 例: var arr = [] 2 for(var i = 0;i < 3; i++){ 3 arr.push([]); 4 } 5 console.log(arr);
二、ECMAScript5(ES5)Array新增方法
(一)迭代(遍历)方法
全体备注:
fn有三个参数 ==> 1、item 数组中的每一项元素 2、idx 索引 3、arr 当前数组
1、forEach(fn) 等同于for循环
1 例: var arr = [10,20,30,40,50,55]; 2 arr.forEach(function(item,idx,arr){ 3 console.log(item); 4 })
2、map(fn) ==> 返回数组
备注:返回一个数组(数组长度等同于原数组的长度),返回的数组里面元素是什么取决于在fn中返回的值
1 例: var arr = [10,20,30,40,50,55]; 2 var res = arr.map(function(item,idx,arr){ 3 return item*10; 4 // 也可以返回字符串拼接(return '<li>'+item+'</li>') // 5 }) 6 console.log(res);
3、filter(fn) ==> 返回trun后的数组
备注:返回一个数组,存放执行fn后返回 trun的数组元素。利用这个方法对数组元素进行过滤筛选。
1 例: 2 var arr = [10,20,30,40,50,55]; 3 var res = arr.filter(function(item,idx,arr){ 4 return item>20; 5 }) 6 console.log(res);
4、some(fn) ==> 判断数组只要有一个满足
备注:判断数组中是元素是否满足 return的条件,只要有即最终返回true(任何一项返回 true,则返回true )
1 例: 2 var arr = [10,20,30,40,50,55]; 3 var res = arr.some(function(item,idx,arr){ 4 return item >50; 5 }) 6 console.log(res);
5、every(fn) ==> 判断数组每个都满足
备注:判断数组中元素是否每一个都满足 return的条件,有一个不满足, 最终返回false
1 例: 2 var arr = [10,20,30,40,50,55]; 3 var res = arr.every(function(item,idx,arr){ 4 return item >5; 5 })
(二)归并方法 reduce(fn,initval)
备注:这两个方法都会迭代数组中的所有项,然后生成一个最终返回值。
1、fn的参数(prev,item,idx,array )
备注:fn是每一项调用的函数,函数接受4个参数分别是
(1)prev 上一次函数的返回值
(2) item 当前值
(3)idx(index) 当前索引
(4)arr 当前数组
2、initval的值
(5)若 reduce的第二个参数 initval有值,则prev第一次的值为initval
(6)若reduce的第二个参数initval没有值,则prev第一次的情况会默认以索引为0为对于的元素为prev的值
1 例: 2 var res = arr.reduce(function(prev,item,idx){ 3 return prev+item; 4 },0) 5 console.log(res);
(三)静态方法
1、Array.isArray() 判断是否为数组
例:console.log(Array.isArray([1,2,3])); 返回值是true就为数组。
(四)数组的索引方法
1、indexOf(keyword[,startIdx]) (正序)
1 例: 2 var arr = [-1,3,45,768,89,687,454,89,454,89]; 3 console.log(arr.indexOf(89,5)); 4 (数字5是从第几个索引开始)
2、lastIndexOf(keyword[,startIdx]) (倒序)
1 例: 2 var arr = [-1,3,45,768,89,687,454,89,454,89]; 3 console.log(arr.lastIndexOf(89,5)); 4 (数字5是从倒数第几个索引开始)
3、返回keyword所在数组中的索引值,如果数组不存在keyword,则返回-1;
1 例: 2 var arr = [-1,3,45,768,89,687,454,89,454,89]; 3 console.log(arr.indexOf(100));
备注:indexOf多应用于: 判断数组中是否存在某个值
1 例: 2 arr.indexOf(keyword) == -1 3 some() 4