数组
数组的常用方法(ES3)
改变原数组的
push() 在原数组最后位添加
1
2
3
4
5var arr = [];
arr.push(10); //[10]
arr.push(11); //[10,11]
arr.push(9); //[10,11,9]
arr.push(1,2,3,4,5,6,7) //[10,11,9,1,2,3,4,5,6,7]手动实现一下push方法
1
2
3
4
5
6Array.prototype.myPush = function(){
for(var i=0; i<arguments.length; i++){
this[this.length] = arguments[i];
}
return this.length;
}pop() 把原数组的最后一位剪切出来,pop方法无视传参
1
2
3var arr = [1,2,3];
arr.pop(); //[1,2]
arr.pop(); //[1]shift() 把原数组的第一位删除
unshift() 在原数组的第一位添加,都是添加,只是和push的方向不同。
1
2
3
4
5
6
7var arr = [1,2,3];
arr.unshift(0);
console.log(arr); //[0,1,2,3]
arr.unshift(-3,-2,-1);
console.log(arr); //[-3,-2,-1,0,1,2,3,]
arr.shift();
console.log(arr); //[-2,-1,0,1,2,3,]sort() 升序数组
1
2
3var arr = [4,3,9,1,2]; //无序的数组
arr.sort();
console.log(arr); //得:[1,2,3,4,9]那么
var arr = [4,3,9,1,2];
的话就是[1,2,3,4,9,10]
咯?很遗憾,不是,结果是
[1, 10, 2, 3, 4, 9]
为什么呢?因为sort方法提供的升序排序是按照ascii码值继续排序,那么可以用sort()方法来达到我们想要得到的结果吗?可以,因为sort还提供了一个编程接口,允许我们在sort方法中传入一个参数,这个参数要是一个方法,在方法里面让我们自己来编写排序规则。
但是这个方法有两个一定要的约定:
1
2
3
4
5
6
7
8
9
10var arr = [4,3,9,1,2];
arr.sort(function(x,y){
//这是我们自己的升序规则
if(x>y){
return 1;
}else{
return -1;
}
}) * 1.必须写两个参数
*2.看返回值
*当返回值是负数时,x依然在前,y在后
*当返回值是正数时,y在前,x在后
*当返回值是0时,不动
那么sort括号里的函数是什么时候,怎么执行,执行多少次?
首先,第一次调用匿名函数传入的x,y分别是arr数组中的第一位和第二位,也就是拿4跟3比
4>3吗?是,返回1,返回值正数,所以换一下位置,3在前4在后,
匿名函数执行第一次后arr数组: [3,4,9,1,2]
第二次执行,第一位变成3了,拿第一位和第三位比,3>9吗?不大,返回-1,返回值负数,x,也就是3依然在前,y(9)在后。
第三次执行,x是3,y是1,结果arr数组: [1,3,4,9,2]
第四次,x是1,y是2,结果arr数组: [1,3,4,9,2]
第五次了,第一位已经和其他位全部比完,x从第二位拿,x是3,y是4
如此循环下去。
1
2
3
4
5
6
7
8
9
10var arr = [4,3,9,1,2];
arr.sort(function(x,y){
//这是我们自己的升序规则
if(x>y){
return 1;
}else{
return -1;
}
})上面代码中如果判断条件是x<y就是降序功能,数值大的在前小的在后。
优化代码:
依然是升序,既然我们需要 一个返回结果,x和y作比较,x大于y返回结果要是一个正数,那么直接
return x - y
就满足了上述要求。1
2
3
4
5var arr = [4,3,9,1,2];
arr.sort(function(x,y){
//这是我们自己的升序规则
return x-y;
})x大于y那么相减肯定是正数,反之是负数。
如果是要降序,则判断条件改为
y-x
。reverse 颠倒原数组元素
1
2var arr = ['a','b','c'];
console.log(arr.reverse()); //['c','b','a']splice(参数1,参数2,参数3)
参数1:从下标是几开始切?
参数2:切多少?
参数3:在切口处添加新数据
1
2
3
4var arr = ['a','b','c'];
//两个参数的
arr.splice(1,1); //从下标是1的地方开始切,切一个长度的数据
console.log(arr); //['a','c']1
2
3
4
5var arr = [1,2,3,5];
//三个参数的,假如要实现将数组arr添加一位数据变成[1,2,3,4,5]?
arr.splice(3,0,4);
//在下标是3的地方,切除0个(也就是没有切,所以光标也就是切口,在数字5的前面),添加一个数据4
console.log(arr); //[1,2,3,4,5]注意:参数1可以为负数
1
2
3var arr = [1,2,3];
arr.splice(-1,1);
console.log(arr); //[1,2]-1 代表倒数第几位
不改变原数组的,返回一个新数组出来。
concat() 连接两个数组
1
2
3const arr1 = [1,2,3];
const arr2 = [4,5,6,7];
console.log(arr1.concat(arr2));拼接完之后控制台打印的结果是 [1,2,3,4,5,6,7] , arr1和arr2都没有改变。
join() 数组转换为字符串
1
2
3
4
5var arr = [1,2,3];
var str = arr.join('-');
console.log(typeof(str) +' : ' + str);
//控制台
//string : 1-2-3join函数不传参数默认用逗号
,
连接。数组转换为字符串是用join,与之对应的,字符串转换数组是split( )
字符串的split( )函数
split( 按照字符串中的什么拆分为数组 )
1
2
3var str = 'a-b-c-d-e-f-g';
var arr = str.split('-');
console.log(arr); //(7) ["a", "b", "c", "d", "e", "f", "g"]slice() 截取
slice()
无参数,截取整个数组。
slice(
从下标多少开始截取到最后
)1
2
3var arr = [1,2,3,4,5];
var newArr = arr.slice(2);
console.log(newArr); //[3,4,5]参数如果是负数则表示从倒数第几位开始截取。
slice(
从下标多少开始截取
,截取到第几下标
)1
2
3var arr = [1,2,3,4,5];
var newArr = arr.slice(0,2);
console.log(newArr); //[1,2]
面试题
1、给一个有序的数组,如何操作才可以让这个有序的数组乱序?
1 | //有序的数组使之乱序 |
2、颠倒字符串 str=’abcde’ 为 ‘edcba’
1 | var str = 'abcde'; |