js学习总结----数组

Object->{}、[]、/^$/、时间

  每一个对象都是由属性名和属性值组成的

  var ary = [12,23,34,45]

  数组也是对象,我们看到的是它的属性值,属性名是数字0~3。0存储的是第一项的值 1存储的是第二项的值...我们把代表第几项的这个数字的属性名叫做数组的索引

  length:4 数组的长度  数组中有一个length的属性 ,这个是浏览器天生就给数组增加的(不是我们自己编写的属性),这个属性属于当前数组不可枚举的属性。

  for in循环是用来遍历一个对象中属性名和属性值的,但是对于当前对象不可枚举的属性,我们通过他是遍历不到的,例如:我们无法遍历到ary.length这个属性

  数组常用的方法(15个) 

  学习数组中常用的方法,我们需要按照四个维度去探讨

    1)、方法的作用

    2)、需要传哪些参数

    3)、是否有返回值,返回值是什么

    4)、通过此方法是否对原来的数组产生了改变

  1、关于数组的增加、修改、删除

    1)、push:向数组的末尾增加新的内容

      参数:想向末尾增加哪些内容就传递谁,而且可以传递多个值,用逗号隔开,统一向末尾增加多项

      返回:新增加后数组的长度

      原来的数组已经发生了改变

      扩展:不想使用push,也想向数组的末尾增加内容。

        ary[ary.length] = 10

    2)、pop:删除数组最后一项内容

      参数:没有

      返回:被删除的那一项内容

      原有数组发生改变

      扩展:不用pop想删除最后一项的内容

      ary.length--;

    3)、shift:删除数组中的第一项

      参数:没有

      返回:被删除的那一项

      数组发生改变

    4)、unshift:向数组开头增加一项   

      参数:增加内容

      返回:数组长度

      数组发生改变

    5)、splice:它既能实现删除,也能实现增加,还能实现修改

      [删除]

      ary.splice(n,m) 从索引n开始删除m个元素,把删除的内容以一个新数组的方式返回,原来的数组改变

      ary.splice(n) 从索引n开始,删除到数组的末尾

      ary.splice(0) 把原来的数组中的每一项都删除掉(清空数组每一项),把之前的每一项的值以一个新的数组返回(把之前的数组克隆了一份一模一样的,只不过这样的克隆会修改原来的数组)

      ary.splice() 数组中的一项都没有删除,返回的是一个空数组

      [修改]

      ary[2] = 340 //利用对象的操作的方式修改某一项的值,

      splice(n,m,x) 从索引n开始,删除m个,用x替换删除的部分,把删除的内容以一个新的数组返回,原来的数组改变

      [增加]

      splice(n,0,x)从索引n开始,一个都不删除(返回结果是一个空数组),把x增加到索引n的前面,原来的数组改变

   2、关于数组的截取和拼接

      1)、slice:实现数据的截取,在原来的数组中截取某一部分

        slice(n,m)  从索引n开始,找到索引为m,将找到的部分以一个新的数组返回,原来的数组不变

        slice(n) 从索引n开始 一直找到数据末尾

        slice(0) /slice() 把原来的数组克隆一份一模一样的新数组返回

        思考:

          分析一下slice这几种特殊的情况:n或者m为负数、n>m、n或者m已经超过了整个数组的范围

      2)、concat:把两个数组拼接到一起,原来的数组不变

        ary1.concat(ary2) 把ary1和ary2进行拼接,ary2在后面

        ary1.concat()把ary1克隆一份一模一样的数组

      3)、把数组转化成字符串

        toString():把数组转化成字符串,原来的数组不变

        join():按照每一个分隔符,把数组中的每一项拼接成一个字符串,原来的数组不变。

        扩展:eval->js中把字符串变为js表达式执行的一个方法

        console.log(eval("12+23+34+45"))//114

        将数组中的每一项进行相加求和

        console.log(eval(ary.join("+")));

    4、数组的排序和排列

      1)、reverse:把数组倒过来排序

      2)、sort:给数组进行排序  原来的数组改变

        ary.sort()  这样的话只能处理10以内的数字进行排序,因为它是按照UNICODE编码的值进行排序的。

        ary.sort(function(a,b){return a-b}); 由小到大排序

        ary.sort(function(a,b){return b-a});   由大到小排序

 

    5、只有在标准浏览器中兼容的方法,在ie6-8不兼容的

      1)、indexOf / lastIndexOf (字符串中也有这两个方法,但是字符串的这两个方法兼容所有的浏览器,而数组的这两个方法是不兼容的) :返回元素的索引,原来的数组不变。如果返回的结果为-1,证明在数组中不存在。    

      2)、forEach / map 都是用来遍历 数组中的每一项的

        forEach:数组中有几项,我们的函数就执行几次;函数中的形参 item 为当前遍历的值  index 为当前的索引  原来数组不变

          ary.forEach(function(item,index){})

        map和forEach的语法是一样的,但是比forEach多加了一个把原来内容进行替换的功能

          ary.map(function(item,index){

            return item*10;

          })

          返回的新数组是每一项都乘以10

 

    更多的数组方法:

      console.log(Array.prototype) 

 

    数组去重: (web.jobbole.com/83425)

      利用对象的键值对方法:

        1)、我们把数组中的每一项的值当做一个对象的属性名和属性值存起来

        2)、但是在每一次存储之前,我们判断当前这一项(N)是否在对象中已经存在了。

          如果obj[N]=N 说明已经存在了  ,说明已经存在,那么在数组中把这一项删除

          如果是undefined 说明还没有这一项,说明当前这一项还没有重复,我们把其当做对象的属性名和属性值存储进去即可。

      var ary = [1,2,3,2,12,1,2,3,4,56,12,23]

      var obj = {1:1,2:2,3:3}

      obj[1] = 1;

      obj[2] = 2;

      obj[3] = 3;

      在我要存储第四项的时候,我判断一下对象中是否包含了2这一项。

      obj[2] //2

      obj[4]//undefined

      具体代码如下:     

var ary = [1,2,3,2,12,1,2,3,4,56,12,23];

var obj = {};

for(var i = 0;i<ary.length;i++){
    var cur = ary[i];
    if(obj[cur]==cur) {//说明对象中已经存在cur这一项了 也说明数组已经重复    
        //ary.splice(i,1); //元素内容较多时,后面的每一项的索引都修改了 影响性能
     // 我把数组末尾的那一项拿过来替换当前项,再把数组末尾的那一项删除掉
     ary[i] = ary[ary.length-1];
     ary.length--;//把数组末尾的那一项的值删除掉
i
--;// 解决数组 删除元素数组塌陷问题 continue; } obj[cur] = cur }

 

        

      

      

    

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

  

  

  

posted @ 2017-06-22 16:09  diasa  阅读(257)  评论(0)    收藏  举报