数组方法

167 阅读9分钟

数组方法

数组也是对象数据类型的,也是由键值对组成的

var ary =[12,23,34]
/*
 结构:
  0:12,
  1:23,
  2:34,
  length:3
*/
1.以数组作为索引(属性名),索引从零开始递增
2.有一个length属性存储的是数组长度

ary[0] 获取第一项
ary[ary.length-1] 获取最后一项

数组中每一项的值可以是任何数据类型的

//=>多维数组
var ary =[
    {
        name:'xxx',
        age:20
    },
    {
        name:'xxx',
        age:20
    }
];

数组中的常用方法

按照四个维度记忆:

  • 方法的作用
  • 方法的参数
  • 方法的返回值
  • 原有数组是是否改变

push()

作用:向数组‘末尾’追加新的内容

参数:追加新的内容(可以是一个,也可是多个)

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

原有数组改变

var ary = [12,23,34];
ary.push(56); //=> len:4  ary:[12,23,34,56];
ary.push(100,{name:'xxx'}); //=> len:6 ary:[12,23,34,56,100,{name:'xxx'}]   

pop()

作用:删除数组最后一项

参数:无

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

原有数组改变

var ary =[12,23,34];
ary.pop();//返回34。
//len:2 ary:[12,23]

shift()

作用:删除数组中的第一项

参数:无

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

原有数组改变

var ary = [12,23,34];
ary.shift() //返回12 
// len:2 ary:[23,34]
基于shift删除数组的第一项,第一项被删除后,原有后面每一项的索引都要向前减1(往前提一位)

unshift()

作用:想数组开始位置追加新内容

参数:要新增的内容

返回:新增后数组的长度

原有数组改变

var ary = [12,23,34];
ary.unshift(100,true); //返回数组添加完之后的长度 len:5
// ary:[100,true,12,23,34]

splice

基于splice可以对数组进行很多的操作:删除指定位置的内容、向数组指定位置增加内容、还可以修改指定位置的信息

删除:ary.splice(n,m)

从索引n开始,删除m个内容,把删除部分以一个新数组返回,原有数组改变

如果不指定m或者m大于数组的长度,则删除到末尾

var ary = [0,1,2,3,4,5,6];
ary.splice(2,3);//从索引2开始删除,包括2,删除3个。
//=>返回[2,3,4]  改变原来数组ary:[0,1,5,6]
ary.splice(2);//从索引2开始删除到末尾结束
//=>返回[2,3,4,5,6] 原数组变为ary:[0,1]

新增 :ary.splice(n,0,x,...)

从索引n开始伤处零项(没删除),把x或者更多需要插入的内容存放到数组中索引n的“前面”

var ary = [0,1,2,3,4,5,6];
ary.splice(1,0,'在索引1之前添加','在索引1之前添加')//=>因为没有删除项,所以返回[]
//=>改变原来数组  ary:[0, "在索引1之前添加", "在索引1之前添加",1, 2, 3, 4, 5, 6]

修改:ary.splice(n,m,x,....)

修改的原理就是把原有内容删除掉,然后用新的内容替换这部分信息即可

var ary = [0,1,2,3,4,5,6];
ary.splice(2,3,'弄啥嘞');//=>返回删除项[2,3,4]
// 改变原数组 ary:[0,1,'弄啥嘞',5,6]

练习:

  1. 删除数组最后一项的方法?
var ary = [0,1,2,3,4,5,6];
1. ary.pop()//返回6,     ary:[0,1,2,3,4,5]
2. ary.splice(ary.length-1) //返回[5],     ary:[0,1,2,3,4]
3. ary.length-- //返回5(原数组长度),     ary:[0,1,2,3]
------以下方法不建议------
不建议基于delete删除数组中的某一项,虽然内容没了,但是数组的length长度没有改变
4. delete ary[ary.length-1]//返回true ary:[0,1,2] len:4
  1. 数组最后一项添加内容的方法?
var ary = [0,1,2,3,4,5,6];
1. ary.push(100); //返回 8->增加后的长度,
2. ary.splice(ary.length,0,100);//返回[],因为没有删除项。
3. ary[ary.length]=100;//返回100 ->添加的值。

slice

作用:在一个数组中,按照条件查找出其中的部分内容

参数 : 两个参数(n/m),从索引n开始,找到索引m处,单数不包含m

返回 : 以一个新数组存储查找的内容原有数组不会变

var ary = [0,1,2,3,4,5,6,7,8,9]
ary.slice(2,7)//=>返回:[2,3,4,5,6] 不包含m处
ary.slice(2)//=>返回:[2,3,4,5,6,7,8,9] 不写m,则查找到数组末尾
ary.slice(0) && ary.slice()//=>返回:[0,1,2,3,4,5,6,7,8,9]
//实现数组的克隆:克隆一个新的数组出来,和原油数组内容一样,但是不是相同的内存空间,两个数组是不相等独立的
ary.slice(-3-1)//=>返回[7,8] 支持负数索引,负数运算规则:数组总长度+负数索引

concat

作用:实现多个数组(或者值)的拼接

参数:数组或者值

返回:拼接后的新数组

原有数组不变

var ary1=[1,2,3];
var ary2=[4,5,6];
var ary3=[7,8,9];
ary1.concat(ary2,'哈哈',ary3)//=>返回[1, 2, 3, 4, 5, 6, "哈哈", 7, 8, 9]
[].concat(ary1,ary2,'haha',ary3)//=>返回[1, 2, 3, 4, 5, 6, "哈哈", 7, 8, 9] 可以基于空数组作为皮节的开始,在小括号中排列拼接的顺序,空数组不会占据内容的位置

toString

作用:把数组转换为字符串

参数:无

返回:数组中的每一项用逗号分隔的字符串

原有数组不变

var ary=[1,2,3];
ary.toString()//=>返回"1,2,3" 原数组不变

join

作用:和tosTring类似,也是把数组转换为字符串,但是我们可以设置为字符串后,每一项之间的连接符

参数:指定的连接符

返回:字符串

原有数组不变

var ary = [1,2,3,4,5,6];
ary.join() && ary.join(',')//=>"1,2,3,4,5,6"
ary.join("+")//输出"1+2+3+4+5+6"
eval(ary.join("+"))// 21 基于join我们可以实现数组中每一项求和的功能
1. 基于join,使用+作为分隔符,先把数组变为每一项相加的字符串
2. 基于eval,把字符串变为JS表达式执行,得到的结果就是数组中每一项累加的和

reverse

作用:把数组倒过来排列

参数:无

返回:排列后的新数组

原有数组改变

var ary =[1,2,3,4,5];
ary.reverse()//返回[5,4,3,2,1]   ary:[5,4,3,2,1]

sort

作用:给数组排序

参数:无/函数

返回:排序后的新数组

原有数组改变

//=>sort在不传递参数的情况下,只能处理10以内数字排序
var ary = [7,6,4,5,2,3,1]
ary.sort()//返回[1, 2, 3, 4, 5, 6, 7]
var ary=[18,1,23,4543,21,3,4];
ary.sort()//返回[1, 18, 21, 23, 3, 4, 4543] 并没有按照我们想象的排序

//=>真实项目中,基于sort排序,我们都需要传递参数
var ary = [18,1,23,4543,21,3,4];
ary.sort(function (a,b){
    return a-b;//升序
    return b-a;//降序
})

indexOf / lastIndexOf

这两个方案不兼容IE低版本浏览器(IE6~8)

作用:检测当前值在数组中第一次或者最后一次出现位置的索引

参数:要检测的值

返回:索引

原有数组不变

var ary = [1,2,3,4];
ary.indexOf(3)//返回索引2 基于indexOf检测,如果数组中有着一项,返回一个大于等于零的索引
ary.indexOf(100)//返回-1 如果没有返回的索引为-1
//验证数组中是否包含某一项
if(ary.indexOf(100)>1){
    //=>ARY中包含100这一项
}

除了以上方法,数组中还包含很多常用方法(Array.prototype)

  • every
  • filter
  • find
  • forEach
  • includes
  • keys
  • map
  • reduce / reduceRight
  • some
  • ...

搞懂这些方法需要了解OPP/作用域/回调函数等

数组去重

//以下方法耗性能

//方法一
var ary = [1,2,2,1,4,5,3,4,6,5,6];
// =>i<ary.length-1;不用拿最后一项
for(var i = 0;i<ary.length-1;i++){
    var item = ary[i];
    //=>item; 依次拿出的每一项
    //=>i;当前拿出的项的索引
    //=>和当前项后面的每一项比较:起始索引应该是i+1  j<ary.length找到末尾进行比较
    for(var j = i+1;j<ary.length;j++){
        //=>ary[j]:后面需要拿出来和当前项比较的这个值
        if(item==ary[j]){
            //=>相等:重复了,我们拿出来的j这个比较项在原有数组中删除
           // ary.splice(j,1);
            /*这里删除后会导致数组塌陷问题,当我们把当前项删除,后面的项都要向前进一位,也就是原数组的索引发生了改变,索引都会减-1,此时我们继续j+1,下次再拿出来的结果就会跳过一位。
            原数组 [1,2,3,4]
            i=1 =>2 我们把这一项干掉,然后i++,i=2
        	原数组[1,3,4]
        	i=2这一项是4,3这一项就错过了
            */
            ary.splice(k,1);//删除后不让K累加
           
            k--;//删除后先减减,再加加的时候相当于没加没减
        }
    }
}
//方法二
 var ary = [1, 2, 2, 1, 4, 5, 3, 4, 6, 5, 6];
    var obj = {};
    for (var i = 0; i < ary.length; i++) {
        var item = ary[i];
        //=>存储之前需要做判断:如果对象中已经存在这个属性了,说明当前item再之前出现过,也就是当前项重复了,我们把当前项删除
        if (typeof obj[item] === "undefined") {
            obj[item] = item;//=>obj[1]=1 =>{1:1}
            continue;
            // 这种删除方式不好,如果数组很长,我们删除某一项,后面索引都需要重新机选,非常耗性能
        }
        ary.splice(i, 1);
         i--;//防止数组塌陷
    }

ES6方法,有兼容性问题

var ary = [1, 2, 2, 1, 4, 5, 3, 4, 6, 5, 6];
var newAry = Array.from(new Set(ary))
//newAry: [1, 2, 4, 5, 3, 6]

数组去重推荐方法

1.
  var ary = [1, 2, 2, 1, 4, 5, 3, 4, 6, 5, 6];
    var obj = {};
    for (var i = 0; i < ary.length; i++) {
        var item = ary[i];
        //=>存储之前需要做判断:如果对象中已经存在这个属性了,说明当前item再之前出现过,也就是当前项重复了,我们把当前项内容替换为最后一项内容,然后把最后一项删掉,然后i--,重新判断当前项
        //这样不影响索引,不耗性能
        if (typeof obj[item] !== "undefined") {
            ary[i] = ary[ary.length - 1]
            ary.pop();
            i--;
            continue;
        }
        obj[item] = item;
    }
    console.log(ary)

2.
 // 创建一个新数组,判断新数组有无,无则添加,有则跳过进行下次循环
     var ary = [1, 2, 2, 1, 4, 5, 3, 4, 6, 5, 6];
     var newAry = [];
     for (var i = 0; i < ary.length; i++) {
         if(newAry.indexOf(ary[i])>-1){
             continue
         }
         newAry.push(ary[i])
     }