数组及常用方法

思维导图

​​​​​​​

 

数组的基本概念


.什么是数组?
数组是存储一个或多个数据的容积,它是一组内存空间,通常用来批量处理数据,这组内存空间的名字叫做数组
2.数组的特点
对齐自身储存的数据并没有什么要求,无论是数量还是类型, 数组中的每一项可以是任意一种数据类型通,过数组下标来管理数组
3.length
数组也是对象数据类型,它也是有键值对组成,属性名是数字,并且有一个length属性,数组名.length表示数组的长度,也是数组当前存储元素的个数,因为下标从0开始,所以数组长度-1表示最后一个元素的下标
 怎么创建一个数组
1. 字面量(语法糖)
2. new创建

``` 
        //字面量创建一个数组
        var arr = [1, 2, 3]
        //new创建
        var arr1 = new Array(1, 2, 3)
```


数组常用的方法


1.push
-   作用:向数组末尾追加某一项
-   参数:添加的具体项,可以是一项,也可以是多项
-   返回值:新数组的长度
-   是否改变原数组:改变

    //push 向数组末尾追加一项
        var ary = [1, 2, 3];
        let newarr = ary.push(4); //添加的具体项
        console.log(ary); //改变原来数组:[1, 2, 3, 4]
        console.log(newarr);//4 新增数组的长度


2.pop
-   作用:删除数组的最后一项
-   参数:无
-   返回值:删除的项
-   是否改变原数组:改变

        //pop 删除数组的最后一项
        var ary = [1, 2, 3];
        let newarr = ary.pop(); //无参数
        console.log(ary); //改变原来数组:[1, 2]
        console.log(newarr);//3 删除的项


3.shift
-   作用:删除数组的第一项
-   参数:无
-   返回值:删除的项
-   是否改变原数组:改变

    // shift删除数组第一项
        var ary = [1, 2, 3];
        let newarr = ary.shift(); //无参数
        console.log(ary); //改变原来数组:[2,3]
        console.log(newarr);//1 删除的项


4.unshift
-   作用:向数组的开头添加内容
-   参数:添加的内容
-   返回值:新数组的长度
-   是否改变原数组:改变

       // unshift删除数组第一项
        var ary = [1, 2, 3];
        let newarr = ary.unshift(0); //无参数
        console.log(ary); //改变原来数组:[0,1,2,3]
        console.log(newarr);///4 新增数组的长度


5.splice
-   作用:删除/新增/修改
-   参数:splice(n,m,...x) ;完整的写法,第一个参数代表从哪个索引开始,删除m项,把删除的内容用x进行替换
-   返回值:是一个数组,里面是删除的每一项
-   是否改变原数组:是

删除

ary.splice(n,m); 从索引n开始,删除m项

如果后面的m不写,或者超出数组的长度,就是从索引n删除到数组最后一项

    // splic删除
        var ary = [1, 2, 3];
        let newarr = ary.splice(0, 1); //从索引0开始删除1项
        console.log(ary); //改变原来数组[2, 3]
        console.log(newarr);//[1] 一个数组,删除的项

新增

ary.splice(n,0,....x)从索引n开始,删除0项,并且把x项添加的内容新增到索引n的前面

返回值是一个空数组

       // splic新增
        var ary = [1, 2, 3];
        let newarr = ary.splice(0, 0, 5); //从索引0开始删除0项,并把添加的内容增加到1的前面
        console.log(ary); //改变原来数组 [5, 1, 2, 3]
        console.log(newarr);//一个空数组

修改

ary.splice(n,m,...x);从索引n开始删除m项,并且用后面的内容进行替换,

       // splic修改
        var ary = [1, 2, 3];
        let newarr = ary.splice(1, 2, 4, 5); //从索引1开始删除2项,替换成4,5
        console.log(ary); //改变原来数组[1, 4, 5]
        console.log(newarr);//[2, 3]一个数组,删除的项

6.slice

  • 作用:从原有的数组中选中特定的内容
  • 参数:slice(n,m):选中从索引n(包含n)开始---索引m的项(不包含m)
  • 返回值:返回值是一个数组,返回的每一项是复制的项
  • 是否改变原数组:不改变
    // slice 从原有的数组中选定特定的内容
        var ary = [1, 2, 3, 4, 5, 6];
        let newarr = ary.slice(1, 4); //从索引1开始(包含1)--索引到索引4的项(不包含4)
        console.log(ary); //不改变原来数组
        console.log(newarr);//[2, 3 ,4]一个数组,复制的每一项

含头不含尾

想要复制所有项 不跟参数或者0

注意:克隆的新数组和原来的数组并不相等,因为是不同的堆内存地址;(浅克隆)

7.concat

  • 作用:实现多个数组或者值的拼接
  • 参数:数组或者值
  • 返回值:返回值是拼接后的新数组
  • 是否改变原数组:不改变
//concat实现多个数组和或值的拼接
        //不改变原数组
        var ary1 = [1, 2, 3];
        var ary2 = [4, 5, 6];
        var res = ary1.concat(ary2, "同学");//数组或者值
        console.log(res);//[1, 2, 3, 4, 5, 6, '同学'] 拼接后的新数组

8.toString

  • 作用:可以把一个逻辑值转换为字符串
  • 参数:无
  • 返回值:返回值是转换后的字符串
  • 是否改变原数组:不改变
  // toString 可以把一个逻辑值转为字符串
        var ary1 = [1, 2, 3];
        var res = ary1.toString();//无参数
        console.log(ary1);//不改变原数组
        console.log(res);//转换后的字符串

9.join

  • 作用:把数组通过指定的连接符,转换为字符串
  • 参数:连接符
  • 返回值:返回值是转换后的字符串
  • 是否改变原数组:不改变
     var ary1 = [1, 2, 3];
        var res = ary1.join("+");// 参数 连接符 
        console.log(ary1); //不改变原来数组
        console.log(res);// 转换后的字符串 "1+2+3";
        eval(res) //==> eval  执行计算

eval 执行计算

10.reverse 倒序

  • 作用:把数组倒过来
  • 参数:无
  • 返回值:返回值是排序后的新数组
  • 是否改变原数组:改变
  //reversre把数组倒过来
        var ary = [1, 2, 3];
        var res = ary.reverse();//参数 无
        console.log(res);//===排序后的新数组[3,2,1];
        console.log(ary);//===改变原数组[3,2,1];

11.sort 排序

  • 作用:把数组进行排序
  • 参数:无或者是一个函数
  • 返回值:排序后的新数组
  • 是否改变原数组:改变

不传参的时候 10以内的可以排列,超出10以内的只能按照第一位进行排序

        // sort把数组进行排序
        //----------------------不传参的时候
        //=====>10 以内的可以排
        var ary = [3, 2, 1, 6, 8];
        res = ary.sort();
        console.log(ary);//改变原来数组[1, 2, 3, 6, 8]
        console.log(res); //排序后的新数组

   //=====> 超出10以内的,只能按照第一位进行排序
        var ary2 = [1, 21, 5, 33, 26]
        res = ary2.sort();
        console.log(res);// [1, 21, 26, 33, 5] 

传参的时候  一个函数 a-b升序, b-a降序

     //---------------------------传参的时候
        var ary2 = [1, 21, 5, 33, 26]
        ary2.sort(function (a, b) {
            return a - b; // 升序 [1, 5, 21, 26, 33]
            return b - a; //降序 [33, 26, 21, 5, 1]
        })

12.includes 

  • 作用:检测数组中是否包含某一项
  • 参数:具体项
  • 返回值:布尔值
  • 是否修改原数组:否
        // includes 检测数组中是否包含某一项
        // 不改变数组,参数查询的项,不改变数组,返回布尔值
        [1, 2, 3].includes(2); // true
        [1, 2, 3].includes(100); // false

13.forEach

  • 作用:遍历数组中的每一项
  • 参数:函数
  • 返回值:undefined
  • 是否修改原数组:否

forEach VS for

 forEach是函数式编程(把循环的操作封装到函数中,我们无需关注循环的过程,只需要关注结果 WHAT);for循环是命令式编程(循环的过程自己把控,关注过程 HOW);

  •  forEach会迭代数组每一项,不支持提前结束循环、也不支持跳跃时循环
  •  for循环想干啥就干啥
  •   真实项目中,大部分需求都直接基于forEach处理即可,这样可以提高开发效率,减少冗余代码;但是某些负责的需求,需要我们在循环过程中做一些特殊处理的,我都自己写for循环... 
        //遍历数组某一项,参数 一个函数 ,不改变数组
        var ary3 = [1, 2, 3];
        let res = ary3.forEach(function (item, index) {
            // item 每一项的具体值
            // index 每一项的索引
            console.log("item:" + item + "--index:" + index);
            // item: 1--index:0
            // item: 2--index: 1
            // item: 3--index: 2
        })
        console.log(res);// 返回值undefined

14.map

  • 作用:把一个数组可以映射成一个新的数组
  • 参数:函数
  • 返回值:映射后的新数组
  • 是否修改原数组:否

        // map作为一个数组可以映射一个新数组,参数一个函数,
        var ary3 = [1, 2, 3];
        var res = ary3.map((item, index) => {
            return item + "index";
        })
        console.log(res)//[ '1index', '2index', '3index' ] 新数组
        console.log(ary3);//不改变原数组

15.indexof

  • 作用:获取某项在数组中首次出现/最后出现的 索引(也可以用来是否包含某项)
  • 参数:(n,m)  n检测的项 从索引m开始检索
  • 返回值:-1或者具体的索引值 -1不包含这一项
  • 是否改变原数组:不改变
       var ary = [1, 2, 3, 4, 1, 55, 1];
        //检测1这个项目在数组ary 中首次出现的位置
        ary.indexOf(1); //0
        //从索引2开始,检测1这个项目在数组中首次出现的位置
        ary.indexOf(1, 2); //4
        console.log(ary.indexOf(99)); //-1不包含这一项

lastIndexOf最后出现的索引

        var ary = [1, 2, 3, 4, 1, 55, 1];
        // 检测1这个项目在数组中最后一次出现的索引
        a = ary.lastIndexOf(1);
        console.log(a);//6 索引号是正的
        // 检测1这个项目在数组中最后出现的索引,在索引5的位置停止检测
        b = ary.lastIndexOf(1, 5)
        console.log(b);//4

16.filter

  • 作用:过滤原始数组,返回新数组
  • 参数:函数
  • 返回值:符合条件的新数组
  • 是否修改原数组:否
  // filer过滤原始数组, 返回新数组 筛选符合条件的
        let a = [22, 10, 21, 9]
        let fn = a.filter(function (value, index) {
            return value > 20
        })
        console.log(a);//[22, 10, 21, 9] 不修改原数组
        console.log(fn);// [22, 21]返回大于20的值

17.Array.form()

  • 作用:将伪数组转为数组
  • 参数:要转换的伪数组
  • 返回值:新数组
  • 是否修改原数组:否
     let obj = {
            0: 'a',
            1: 'b',
            2: 'c',
            length: 3
        }
        let arr = Array.from(obj)
        console.log(obj);//{0: 'a', 1: 'b', 2: 'c', length: 3}不改变原数组
        console.log(arr);// ['a', 'b', 'c']新数组

18.find/findIndex

find/findIndex按照条件找到符合的这一项(这一项的索引):有多项符合条件,只找第一个符合的即可;如果一个符合的都没有,结果是undefined/(-1)

let arr = [10, 20, 30, 40, 50];
let item = arr.find((item, index) => {
    return item > 30;
});
console.log(item); //40 如果有多个只返回一个
//如果没有就是(undefined)-1

19.some

some依次迭代数组中的每一项,只要其中有一项符合设定的条件,则结果是TRUE,如果所有项都不符合条件,则结果是FALSE;

// let arr = [10, 20, 30, 40, 50];
console.log(
    arr.some((item) => item > 30)
); //true
有一项符合就是true

20.every

every和some相反,他是所有项都符合条件结果才是TRUE,只要有有一项不符合结果就是FALSE;       

// let arr = [10, 20, 30, 40, 50];
console.log(
    arr.every((item) => item > 30)
); //false 所有项都符合才是true

21.reduce/reduceRight

依次迭代数组每一项(reduceRight是从右到左迭代),他会把上一次迭代中,回调函数处理的结果传递给下一次迭代,以此实现结果的累积

 let arr = [10, 20, 30, 40, 50];
 let total = arr.reduce((x, item, index) => {
    // 第一次迭代 x=10 item=20 index=1 处理结果30 (x获取数组第一项,然后从数组第二项开始迭代)
    // 第二次迭代 x=30(上一次处理的结果) item=30 index=2 处理结果60
    // 第三次迭代 x=60 item=40 index=3 处理结果100
    // 第四次迭代 x=100 item=50 index=4 处理结果150
    // 循环结束,最后处理结果150赋值给外面的total
    return x + item;
});
let total = arr.reduce((x, item, index) => {
    // 第一次迭代 x=100 item=10 index=0 处理结果110
    // ...
    return x + item;
}, 100); //第二个参数是给x的初始值 从数组第一项开始迭代 

22.  flat 数组扁平化「ES6」

  •  flat(n) 降低N个维度
  • flat(Infinity) 不论原始数组是几维,直接降为1维
 let arr = [
    10,
    [20, 30, [40, 50, [60, 70]]],
    80,
    [90, [100, 110]]
];
console.log(arr.flat(Infinity)); 
//不论原始数组是几维,直接降为1维

fill 数组填充「ES6」

        稀疏数组和密集数组

  •  稀疏数组:数组中并不是每一项都有值  例如:new Array(5),长度是5,但是每一项都是empty
  • 密集数组:每一项都有值
  • 迭代方法在处理的时候,如果是数组中的稀疏项,那么是不去进行迭代的
new Array(5).fill(null).forEach(() => {
    console.log('OK');
}); 

【思考】

删除数组最后一项,你有几种方法?

  • ary.pop()
  • ary.splice(ary.length-1,1);
  • ary.length--

向数组末尾追加新内容,你有几种方法?

  • ary.push(x);
  • ary.splice(ary.length,0,x);  或者ary.splice(ary.length,1,x);
  • ary[ary.length]=x;

总结

改变原数组的方法 push.pop,shift unshift,splice reverse sort

不改变原数组 slice, concat tostring join ,indexOf , lastIndexOf ,includes forEach, map.filfter,Array.form

----------------------------------------------------完结,散花---------------------------------------------

------------------------------------接受大佬们的批改,欢迎留言--------------------------------------------

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值