数组常用方法

数组

数组的常用方法(ES3)

  • 改变原数组的

    • push() 在原数组最后位添加

      1
      2
      3
      4
      5
      var 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
      6
      Array.prototype.myPush = function(){
      for(var i=0; i<arguments.length; i++){
      this[this.length] = arguments[i];
      }
      return this.length;
      }


    • pop() 把原数组的最后一位剪切出来,pop方法无视传参

      1
      2
      3
      var arr = [1,2,3];
      arr.pop(); //[1,2]
      arr.pop(); //[1]


    • shift() 把原数组的第一位删除

    • unshift() 在原数组的第一位添加,都是添加,只是和push的方向不同。

      1
      2
      3
      4
      5
      6
      7
      var 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
      3
      var 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
      10
      var 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
      10
      var 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
      5
      var arr = [4,3,9,1,2];
      arr.sort(function(x,y){
      //这是我们自己的升序规则
      return x-y;
      })

      x大于y那么相减肯定是正数,反之是负数。

      如果是要降序,则判断条件改为y-x


    • reverse 颠倒原数组元素

      1
      2
      var arr = ['a','b','c'];
      console.log(arr.reverse()); //['c','b','a']


    • splice(参数1,参数2,参数3)

      参数1:从下标是几开始切?

      参数2:切多少?

      参数3:在切口处添加新数据

      1
      2
      3
      4
      var arr = ['a','b','c'];
      //两个参数的
      arr.splice(1,1); //从下标是1的地方开始切,切一个长度的数据
      console.log(arr); //['a','c']
      1
      2
      3
      4
      5
      var 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
      3
      var arr = [1,2,3];
      arr.splice(-1,1);
      console.log(arr); //[1,2]

      -1 代表倒数第几位



  • 不改变原数组的,返回一个新数组出来。

    • concat() 连接两个数组

      1
      2
      3
      const 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
      5
      var arr = [1,2,3];
      var str = arr.join('-');
      console.log(typeof(str) +' : ' + str);
      //控制台
      //string : 1-2-3

      join函数不传参数默认用逗号,连接。

      数组转换为字符串是用join,与之对应的,字符串转换数组是split( )

      字符串的split( )函数

      split( 按照字符串中的什么拆分为数组 )

      1
      2
      3
      var 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
      3
      var arr = [1,2,3,4,5];
      var newArr = arr.slice(2);
      console.log(newArr); //[3,4,5]

      参数如果是负数则表示从倒数第几位开始截取。

      slice( 从下标多少开始截取截取到第几下标 )

      1
      2
      3
      var arr = [1,2,3,4,5];
      var newArr = arr.slice(0,2);
      console.log(newArr); //[1,2]






面试题

1、给一个有序的数组,如何操作才可以让这个有序的数组乱序?

1
2
3
//有序的数组使之乱序
const arr = [1,2,3,4,5,6,7,8,9];
console.log( arr.sort(function(){ return Math.random() - 0.5; }) );

2、颠倒字符串 str=’abcde’ 为 ‘edcba’

1
2
3
4
5
6
7
8
9
10
11
var str = 'abcde';
var arr = [];
//字符串转换为数组
for(var i=0;i<str.length;i++){
arr.push(str.charAt(i));
}
//颠倒数组
arr.reverse();
//数组转换字符串,正则表达式去掉逗号
str = arr.join().replace(/,/g, "");
console.log(str);