GeQin

导航

数组的常用方法(详解)

数组常用方法

1.arrayObject.shift();无参数,删除数组的第一项,返回删除项,原数组改变。

  //例如
  var arr = [1,2,3];
  arr.shift();   //返回结果为[1],原数组为[2,3]

2.arrayObject.unshift(num1[,num2...]);将元素插入到数组的起始位置,返回新数组的长度,原数组改变。

  //例如
  var arr = [1,2,3];
  arr.unshift(4,5);   //返回结果为5,原数组为[4,5,1,2,3]

3.arrayObject.pop();无参数,删除数组的最后项,返回删除项,原数组改变。

  var arr = [1,2,3];
  arr.pop();   //返回结果为[3],原数组为[1,2]

4.arrayObject.push(num1[,num2...]);插入到数组的末尾,返回新数组的长度,原数组改变。

  var arr = [1,2,3,9];
  arr.push(7,8); //返回结果为6,原数组为[1,2,3,9,7,8]

5.arrayObject.splice(index,length[,num1,num2...]);index参数必选,从索引index处删除length个(若length不传,则从index处删除至末尾),用num1,num2...代替删除的内容,返回删除项,原数组改变。

  var arr = [1,2,3,9];
  arr.splice(1,2,11);  //返回结果为[2,3],原数组为[1,11,9]

6.arrayObject.slice(start,end);截取,返回截取后的数组,原数组不变。

start:必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2指倒数第二个元素,以此类推。

end:可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么截取的数组包含从start到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

  var arr = [0,1,2,3,4,5,6,7,8];
  var newArr = arr.slice(2,6);
  var newArr1 = arr.slice(-2);
  console.log(newArr); //[ 2, 3, 4, 5 ]
  console.log(newArr1); //[ 7, 8]
  console.log(arr); //原数组不变[ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]

7.arrayObject.concat(num1[,num2...]);合并数组,返回合并后的数组,原数组不改变。

  var arr = [1,2,3];
  arr.concat(4,5);  //返回结果为[1,2,3,4,5],原数组为[1,2,3]

8.arrayObject.reverse();数组倒序,返回倒序后的数组,原数组改变。

    var arr = [1,2,3];
    arr.reverse();  //返回结果为[3,2,1],原数组为[3,2,1]

9.arrayObject.sort(function);对数组的元素排序,返回排序后的数组,原数组改变

数组在原数组上进行排序,不生成副本。

    var arr = [11,22,3];
    arr.sort(function(a,b) {
      return a-b;  //由大到小排列,b-a为由小到大
    }); 
    console.log(arr);//返回结果为[3,11,22],原数组为[3,11,22]

若无参数,则按照字符编码的顺序进行排序,需要将数组的元素都转换成字符串(如有必要),以便进行比较。

  var arr = ['3','11', '22', '1'];
  arr.sort();  //结果为[ '1', '11', '22', '3' ]

若比较的为对象数组

   //需求:对age进行排序
   let objArr = [
       {"name": "Kenny", "age": 24},
       {"name": "Alice", "age": 18},
       {"name": "Leo", "age": 52},
       {"name": "Kiki", "age": 22},
   ];
   objArr.sort(function (a, b) {
       var ageA = a.age;
       var ageB = b.age;
       if (ageA < ageB) {
           return -1;
       } else if (ageA > ageB) {
           return 1;
       } else {
           return 0;
       }
   });
   console.log(objArr);
   /*结果
   [ { name: 'Alice', age: 18 },
   { name: 'Kiki', age: 22 },
   { name: 'Kenny', age: 24 },
   { name: 'Leo', age: 52 } ]*/

数组为汉字,按照汉字的Unicode编码来排序。

   var arr = ['北','京','我','爱','你'];
   //汉字对应的Unicode编码:\u5317  \u4eac  \u6211  \u7231  \u4f60
   arr.sort(function (a,b) {
       return a.localeCompare(b);
   });
   console.log(arr); //[ '京', '你', '北', '我', '爱' ]

10.arrayObject.join(separator)将数组的元素组成一个字符串,以separator分开,若不传参数,则默认以逗号分开;返回组成后的字符串,原数组不变。

var arr = [0,1,2,3,4,5,6,7,8];
var str = arr.join('*');
console.log(str); //返回的结果为:'0*1*2*3*4*5*6*7*8'

11.arrayObject.indexOf(num1[,start])从数组start位置往后查询,若start不传,则默认从数组索引0处开始往后查询;返回查到的元素的索引,若该元素不存在这个数组中,则返回-1。(ES5新增)

此方法可用于判断某一个元素是否存在于数组中。

var arr = [1,2,3];
var index = arr.indexOf(3);
var index1 = arr.indexOf(5);
console.log(index); //返回的结果为:2
console.log(index1); //返回的结果为:-1

12.arrayObject.lastindexOf(num1[,start])用法同indexOf一致,从数组start位置往前查询,若start不传,则默认从数组最后一项开始往前查询,返回查到的元素的索引,若该元素不存在这个数组中,则返回-1。(ES5新增)

var arr = [0,1,2,3,2];
var lastIndex = arr.lastIndexOf(2);
var lastIndex1 = arr.lastIndexOf(2,3);
console.log(lastIndex); //结果为4
console.log(lastIndex1); //结果为2

13.arrayObject.toString();将数组转换为字符串,并返回结果,原数组不变。

 > 返回值与没有参数的 join() 方法返回的字符串相同。
  var arr = [0,1,2,3];
  var str = arr.toString();
  console.log(str); //结果为'0,1,2,3';

14.Array.prototype.slice.call();类数组转数组,原数组不变。

var obj = {length:4,0:'hello',1:'word',2:'bei',3:'jing'};
var arr = Array.prototype.slice.call(obj);
console.log(arr);//结果:[ 'hello', 'word', 'bei', 'jing' ]

该方法不兼容,顺带写一个类数组转数组兼容处理的方法(如下)。

var toArray = function (obj) {
    var ary = [];
    try {
        ary = Array.prototype.slice.call(obj);
    } catch (e) {
        for (var i = 0; i < obj.length; i++) {
            ary.push(obj[i]);
        }
    }
    return ary;
};

15.ES5新增的遍历数组方法:forEach、map、filter、find,原数组均不改变。

  • arrayObject.forEach(callback[,thisObj])(callback参数为function,thisObj参数为this指向)遍历数组中的每一项,无返回值。
var arr = [2 ,3, 4];
arr.forEach(function(item,index,self){
    //item 数组的每一项,依次为:2,3,4
    //index 对应的数组索引,依次为:0,1,2
    //self 数组本身,依次为:[2 ,3, 4],[2 ,3, 4],[2 ,3, 4]
});

forEach的封装

Array.prototype.myForEach = function (callback, context) {
    context = context || window;
    if ('forEach' in Array.prototype) {
        this.forEach(callback, context);
        return;
    } else {
        for (var i = 0; i < this.length; i++) {
            callback.call(context, this[i], i, this);
        }
    }
}
  • arrayObject.map(callback[,thisObj]):映射,基本用法跟forEach类似,但是有返回值,返回值是一个数组,记录了每一个回调函数的返回值。
//有返回值的情况
var arr = [1, 2, 3, 4];
var arr1 = arr.map(function (item, index, self) {
    return item*10;
});
console.log(arr1);//输出:[ 10, 20, 30, 40 ]
//无返回值的情况
var arr2 = arr.map(function (item, index, self) {});
console.log(arr2);//输出:[ undefined, undefined, undefined, undefined ]

map的封装

  Array.prototype.myMap = function (callback, context) {
      context = context || window;
      if ('map' in Array.prototype) {
          return this.map(callback, context);
      } else {
          var ary = [];
          for (var i = 0; i < this.length; i++) {
              var res = callback.call(context, this[i], i, this);
              ary.push(res);
          }
          return ary;
      }
  }
  • arrayObject.filter(callback[,thisObj]):过滤,返回过滤后的数组,基本用法跟map非常类似,callback返回值弱等于(==)true或者fasle,若为true,则表示通过(该元素保留下来了,继续查找下一项),false表示不通过(继续查找下一项)。
   //过滤偶数
   var arr = [1, 2, 3, 4, 5, 6];
   var arr1 = arr.filter(function (item, index, self) {
       return item % 2 == 0;
   });
   console.log(arr1);//输出结果为:[ 2, 4, 6 ]
  • arrayObject.find(callback[,thisObj]);查找,返回符合符合条件的数组,基本用法跟filter类似,callback返回值弱等于(==)true或者fasle,若为true,则表示找到该项,并返回,不再继续查找下一项,false表示未找到(继续查找下一项)。

区别:filter返回所有符合条件的值(相当于find all),find返回第一个符合条件的值。

   //查找第一个值为偶数
      var arr = [1, 2, 3, 4, 5, 6];
      var arr1 = arr.find(function (item, index, self) {
          return item % 2 == 0;
      });
      console.log(arr1);//输出结果为:[2]

posted on 2017-06-07 10:41  GeQin  阅读(785)  评论(0编辑  收藏  举报