数组及常用方法

2023-11-15

思维导图

​​​​​​​

 

数组的基本概念


.什么是数组?
数组是存储一个或多个数据的容积,它是一组内存空间,通常用来批量处理数据,这组内存空间的名字叫做数组
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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组及常用方法 的相关文章

随机推荐

  • 【JDK】Mac版安装JDK并配置环境

    参考文章地址 https www cnblogs com dingzhijie p 7016397 html https blog csdn net deliciousion article details 78046007 教程内容为在M
  • linux日志生成速率统计,Linux学习29-awk提取log日志信息,统计日志里面ip访问次数排序...

    前言 有一段log日志 需从日志里面分析 统计IP访问次数排序前10名 查看是否有异常攻击 日志提取 如下日志 这段日志包含的信息内容较多 我们希望提取ip 访问时间 请求方式 访问路径 不带参数 状态码 123 125 72 61 05
  • numpy.empty的用法

    一 用法 np empty shape dtype float order C 二 参数 shape 返回空数组的维度 dtype 指定输出数组的数值类型 order 是否在内存中以C或fortran 行或列 顺序存储多维数据 三 返回值
  • qt Connect 连接两种方式

    https blog csdn net xiezhongyuan07 article details 79247022 写的挺清楚
  • python画玫瑰图_python之windrose风向玫瑰图的用法-Go语言中文社区

    1 安装 A package is available and can be downloaded from PyPi and installed using pip install windrose Install latest deve
  • SamlSsoClient

    Copyright C 2009 Google Inc Licensed under the Apache License Version 2 0 the License you may not use this file except i
  • 显示具体化、显示实例化、隐式实例化

    讨论这三者的区别我们要先认识函数模板 函数模板是C 新增的功能 他会创建一个通用的函数以支持多种不同类型的形参 避免函数体的重复设计 在我们需要重复用到某一段代码但是需要处理不同类型的参数时 使用函数模板是很方便的一个手段他最大的特点是把数
  • 列可以设置 :formatter,对列的值进行处理

    需要对数字进行处理
  • 美图2022年财报:AIGC引领创新,多重驱动共振向上

    2022年是美图发展的关键之年 在数字化趋势加速的背景下 美图通过持续优化用户体验和不断拓展业务领域边界 进一步巩固了其行业竞争优势 近日 美图公司发布2022财年年度业绩 在收入 用户 创新等方面均取得了令人瞩目的成绩 展现了强劲的发展势
  • VMware导入vmdk文件(亲测有效)

    场景 从别的地方拷贝了一个系统镜像 后缀是vmdk格式 现在演示如何导入到本地 操作步骤 打开vmware 点击文件 新建虚拟机 2 选择自定义 高级 下一步 3 硬件兼容性 默认选择最新的行 因为和本地安装的vmware版本有关 这里演示
  • Fiddler笔记(一)

    个人学习笔记 整理不易 有帮助点个赞 笔记目录 学习笔记目录 pytest和unittest airtest weixin 42717928的博客 CSDN博客 目录 一 简单了解 二 下载安装 三 工具使用 四 HTTP协议报文结构 1
  • 【操作系统】Linux常用基础和高级命令

    目录 一 Linux内核 二 Linux发行版 操作系统 三 Linux终端 三 Linux终端命令 1 命令格式 2 常用基础命令 1 查看目录命令 2 切换目录命令 3 创建文件和目录命令 4 删除文件和目录命令 5 复制文件和目录命令
  • 使用LeNet实现图像分类任务

    本篇的主要内容是解析一下使用MindSpore深度学习框架训练LeNet网络对Mnist数据集进行分类 首先我给大家展示出本篇内容的一个示意图 帮助大家更直观的看到训练过程的一个重要步骤 如图所示 其中1 2 3 表示训练过程中的次序 下面
  • RSA密码原理详解及算法实现(六步即可掌握)

    一 RSA算法概述 rsa算法是一种非对称加密算法 其安全性是建立在大素数难以分解的基础上的 即将两个大素数相乘十分容易 但想对其乘积进行分解却很困难 所以可以将其乘积公开作为加密密钥 二 RSA算法设计理念 根据数论 寻求两个大素数比较简
  • mysql默认值语句

    添加新字段 并设置默认值 alter table test tb add column col3 varchar 20 not null DEFAULT abc 修改原有默认值 alter table test tb alter colum
  • springboot整合logback

    1 在springboot项目resource目录下 创建一个 logback spring xml 文件 2 在logback spring xml文件中添加内容
  • vscode代码统计

    1 安装插件 在vscode界面左侧 点击图中所示的菜单项 搜索Vscode counter 2 使用插件统计代码 点击顶部 View 菜单 gt 在下拉选项中选择第一项 Command Palette gt 工作区选择VscodeCoun
  • 循环机换变速箱油教程_循环机更换自动变速箱油,需要更换的车友可以先了解一下...

    前言 了解汽车知识 让每一位车主维修保养不花冤枉钱 胖哥闲置快半年的自动变速箱循环机 今天终于再次开张了 说起这玩意一年也用不了几次 没有还真不行 自动变速箱油一般6万公里更换 具体大家可根据自己的 车辆保养手册规定 自动变速箱油更换有三种
  • ffmpeg视频裁剪

    需要注意 ffmpeg 命令 s 指定了宽高后 如果为奇数宽高 101 101 则裁剪后的视频无法正常播放 不加 s则ffmpeg自动 1处理 private void cutVideo throws Exception try Strin
  • 数组及常用方法

    思维导图 数组的基本概念 什么是数组 数组是存储一个或多个数据的容积 它是一组内存空间 通常用来批量处理数据 这组内存空间的名字叫做数组2 数组的特点 对齐自身储存的数据并没有什么要求 无论是数量还是类型 数组中的每一项可以是任意一种数据类