数组对象
new Array(),其实就是第二种创建数组的方式:
var arr1 = new Array();//创建一个空的数组
var arr2 = new Array(2);//创建了一个长度为2的数组,数组元素为空
var arr3 = new Array(2,3);//等价于arr3=[2,3]
检测是否为数组
函数传参,当形参为数组而实参不为数组时,会出现bug,所以需要检测传递过来的参数是否为数组。
注意大小写:
var arr = [];
var obj = {};
//第一种方式:instanceof 运算符
console.log(arr instanceof Array);//返回true
console.log(obj instanceof Array);//返回false
//第二种方式:Array.isArray(参数); H5新增的方法
console.log(Array.isArray(arr));//true
console.log(Array.isArray(obj));//false
增删数组元素
方法名 | 说明 | 返回值 |
---|---|---|
push(参数1…) | 在数组末尾添加一个或多个元素 | 返回新的长度 |
pop() | 删除数组最后一个元素,把数组长度减1 | 返回它删除的最后一个元素的值 |
unshift(参数1…) | 在数组的开头添加一个或更多元素 | 返回新的长度 |
shift() | 删除数组的第一个元素,数组长度减1 | 返回删除的第一个元素的值 |
//push()
var arr = [1,2,3];
console.log(arr.push(4,'kalise'));//5
console.log(arr);
//unshift()
console.log(arr.unshift('good'));
console.log(arr);
//pop()
console.log(arr.pop());
console.log(arr);
//shift()
console.log(arr.shift());
console.log(arr);
案例:筛选数组
有一个包含工资的数组[1500,1200,2000,2100,1800],要求把数组中工资超过2000的删除,剩余的放到新数组中:
var arr = [1500,1200,2000,2100,1800];
var arrNew = [];
for(var i=0;i<arr.length;i++){
if(arr[i]<2000){
//arrNew[arrNew.length]=arr[i];
arrNew.push(arr[i]);
}
}
splice【可增可删】
splice(开始的下标,删除的长度,新增的元素…)
作用:在数组的任意位置可以实现增删改
返回值:被删除的元素数组
是否影响原数组 是
var arr = [5,6,7,8,9];
//从2号开始后面的都删除
console.log(arr.splice(2)) //[7,8,9]
console.log(arr); //[5,6]
var arr = [5,6,7,8,9];
//从2号开始(包括2)删除后面的1位,即删除2号位元素
console.log(arr.splice(2,1)) //[7]
console.log(arr); //[5,6,8,9]
var arr = [5,6,7,8,9];
//删除后新增元素,新增的元素为数组
console.log(arr.splice(2,1,[44,55,66])) // [7]
console.log(arr); // [5,6,[44,55,66],8,9]
var arr = [5,6,7,8,9];
//可以新增多个元素,除了[44,55,66]外,true 也是新增的元素
console.log(arr.splice(2,1,[44,55,66],true)) // [7]
console.log(arr); // [5,6,[44,55,66],true,8,9]
var arr = [5,6,7,8,9];
//从2号开始不删除,直接插入
console.log(arr.splice(2,0,[44,55,66],true)) // []
console.log(arr); // [5,6,[44,55,66],true,7,8,9]
slice截取
slice(start,end)
作用:截取指定范围的数组元素
返回值:被截取到的新数组
是否影响原数组 否
var arr = [5,6,7,8,9];
//截取时不包含 end 位的元素
console.log(arr.slice(2,4)) // [7,8]
console.log(arr); // [5,6,7,8,9]
var arr = [5,6,7,8,9];
//从2号开始,后面所有都截取
console.log(arr.slice(2)) // [7,8,9]
console.log(arr); // [5,6,7,8,9]
var arr = [5,6,7,8,9];
//开始结束颠倒,截取到的为空
console.log(arr.slice(4,2)) // []
console.log(arr); // [5,6,7,8,9]
var arr = [5,6,7,8,9];
//如果start和end为负值,表示倒数的意思:倒数第4位到倒数第2位
console.log(arr.slice(-4,-2)) // [6,7]
console.log(arr); // [5,6,7,8,9]
concat拼接
concat(拼接的元素)
作用:将新的元素拼接到指定的数组的后面,形成新的数组(如果拼接的元素中,有数组,则将最外层数组拆开进行拼接)
返回值:拼接后的新数组
是否影响原数组 否
var arr = [5,6,7,8,9]
//注意第三个拼接元素是数组
console.log(arr.concat(-4,-2,[1,[2,3],4],10)) // 5, 6, 7, 8, 9, -4, -2, 1, [2,3], 4, 10
console.log(arr); // [5,6,7,8,9]
var arr1 = [1,2,3,4]
console.log(arr1.concat(arr))//[1,2,3,4,5,6,7,8,9]
复制数组的方法:
- 使用slice复制数组
var arr = [5,6,7,8,9];
var list = [];
function fnCopyArr(arr){
return arr.slice(0)
}
list = fnCopyArr(arr)
arr[0] = 4;
console.log(arr,list) //[4,6,7,8,9],[5,6,7,8,9]
- 使用concat复制数组
var arr = [5,6,7,8,9];
var list = [];
function fnCopyArr(arr){
return arr.concat()
}
list = fnCopyArr(arr)
arr[0] = 3;
console.log(arr,list) //[3,6,7,8,9],[5,6,7,8,9]
- 使用for循环复制数组
var arr = [5,6,7,8,9];
function fnCopyArr(arr){
var list = [];
for(var i = 0,len = arr.length; i < len;i++){
list[i] = arr[i];
}
return list;
}
var list1 = fnCopyArr(arr)
arr[0] = 3;
console.log(arr,list1) //[3,6,7,8,9],[5,6,7,8,9]
或者改用push:
var arr = [5,6,7,8,9];
function fnCopyArr(arr){
var list = [];
for(var i = 0,len = arr.length; i < len;i++){
list.push(arr[i])
}
return list;
}
var list1 = fnCopyArr(arr)
arr[0] = 3;
console.log(arr,list1)
数组排序:
方法名 | 说明 | 是否修改原数组 |
---|---|---|
reverse() | 颠倒数组中元素的顺序 | 会改变原来的数组,返回新数组 |
sort() | 对数组的元素按字符串中的编码从小到大排序 | 会改变原来的数组,返回新数组 |
数组中的数字从大到小排序:
//翻转数组
var arr = ['red','blue','yellow'];
arr.reverse();
console.log(arr);
//数组排序
var arr1 = [12,4,7,34,26,10,8];
arr1.sort(function(a,b){
//return a-b;//升序的顺序排序
return b-a;//降序的顺序排序
});
console.log(arr1);
注意arr.sort(function(a,b){return b-a;});
的写法。更多
冒泡排序
假设一个数组有n个数,要求从小到大排:
理解:
从左到右,每两个相邻的数,从前两个数开始依次向右比较,每次的较大者放在右侧,直到最后两个数,从而确定最大的数在最右侧,至此是一轮;在上一轮中确定的数将不再参与比较;以此循环n-1次,确定n-1个数,最后一个数一定是最小的。
确定 i:只需确认n-1个数,i是从0开始的,所以 i<arr.length-1
确定 j:比较前 已经确定的数 的个数为 i,进行比较的是arr[j]
和arr[j+1]
,j也是从0开始的,所以 j+1<arr.length-i
var arr=[4,5,1,3,2];
for(var i=0;i<arr.length-1;i++){
for(var j=0 ;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
console.log(arr);
蓝框表示需要比较的两个数;红色表示比较之后的结果;橘色框表示循环后确定的数,粉色表示数组索引号
选择排序
我自己也写了一个排序,本以为是冒泡排序,但从算法来看,这个好像是叫选择排序:
var arr=[4,5,1,3,2];
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);
依次取出第一个元素,与后面所有的元素进行比较,符合条件,交换位置
15 6 , 9 , 4 , 2 第一轮
15 9 6 , 4 , 2 第二轮
15 9 6 4 , 2 第三轮
15 9 6 4 2 第四轮
获取数组元素索引
方法名 | 说明 | 返回值 |
---|---|---|
indexOf() | 在数组中查找给定元素的第一个索引 | 如果存在,返回索引号;如果不存在,返回-1 |
lastIndexOf() | 在数组中查找给定元素的最后一个索引 | 如果存在,返回索引号;如果不存在,返回-1 |
var arr = ['red','green','blue','pink','blue','black'];//有两个blue
console.log(arr.lastIndexOf('blue'));
console.log(arr.indexOf('blue'));
console.log(arr.indexOf('yellow'));
数组去重
有一个数组[‘c’,‘a’,‘z’,‘a’,‘x’,‘a’,‘x’,‘c’,‘b’],要求去除重复元素。
var arr = ['c','a','z','a','x','a','x','c','b'];
function unique(arr){
var arrNew = [];
for(var i=0;i<arr.length;i++){
//if(arrNew.indexOf(arr[i])===-1)
if(i==arr.indexOf(arr[i])){
arrNew.push(arr[i]);
}
}
return arrNew;
}
console.log(unique(arr));
数组转换为字符串
方法名 | 说明 | 返回值 |
---|---|---|
toString() | 数组转换成字符串,每一项之间用逗号分隔 | 一个字符串 |
join(‘分隔符’) | 数组转换成字符串,每一项之间用输入的 分隔符 分隔 | 一个字符串 |
//toString()
var arr = [1,2,3];
console.log(arr.toString());//1,2,3
//join(分隔符)
var arr1 = ['green','blue','pink'];
console.log(arr1.join());//green,blue,pink
console.log(arrr1.join('-'));//green-blue-pink
注:单独把数组部分拿出来便于查找。