JavaScript -- 数组详解(使用频率高)【数组专题】

文章目录

  • 前言
  • 一、创建数组
    • 1.1 使用Array构造函数
    • 1.2 使用数组字面量表示法
    • 1.3 ES6语法转换数组
      • 1.3.1 from( )用于将类数组结构转换为数组实例
      • 1.3.2 of( )用于将一组参数转换为数组实例
  • 二、数组常用方法
    • 2.1 复制和填充
      • 2.1.1 copyWithin( )
      • 2.1.2 fill( )
    • 2.2 数组转换
      • 2.2.1 toString( )
      • 2.2.2 valueOf( )
      • 2.2.3 join( )
    • 2.3 栈方法(后进先出)
      • 2.3.1 push( )
      • 2.3.2 pop( )
    • 2.4 队列方法(先进先出)
      • 2.4.1 shift( )
      • 2.4.2 unshift( )
    • 2.5 排序方法
      • 2.5.1 reverse( )
      • 2.5.2 sort( )
    • 2.6 操作方法
      • 2.6.1 concat( )
      • 2.6.2 slice( )
      • 2.6.3 splice( )
    • 2.7 搜索和位置方法
      • 2.7.1、indexOf( )
      • 2.7.2 lastIndexOf( )
      • 2.7.3 includes( )
    • 2.8 迭代方法
      • 2.8.1 every( )
      • 2.8.2 filter( )
      • 2.8.3 forEach( )
      • 2.8.4 map( )
      • 2.8.5 some( )
  • 三、总结


在这里插入图片描述

前言

本文详细介绍了 JavaScript 中数组的的各种用法,包含 ES6+ 语法,以及各种数组操作方法如复制、填充、转换、排序、栈队列操作、搜索和迭代等,帮助读者理解和掌握 JavaScript 数组的使用技巧。


一、创建数组

1.1 使用Array构造函数

//创建一个数组
let arr = new Array();//创建一个初始length为20的数组
let brr = new Array(20);
//给Array构造函数传入保存的值

1.2 使用数组字面量表示法

//创建一个包含3个元素的数组
let arr = ["red","yellow","blue"];//创建一个空数组
let brr = [];//创建一个包含2个元素的数组
let crr = [1,2];

1.3 ES6语法转换数组

1.3.1 from( )用于将类数组结构转换为数组实例

Array.from() 的第一个参数是一个类数组对象,即任何可迭代的结构,或者有一个 length 属性和可索引元素的结构。

//字符串会被拆分为单字符数组
console.log(Array.from("Matt"));//["M","a","t","t"];//可以使用from()将集合和映射转换为一个新数组
const m = new Map().set(1,2).set(3,4);
console.log(Array.from(m));//[[1,2],[3,4]];

Array.from( ) 还接收第二个可选的映射函数参数。

const a1 = [1,2,3,4];
const a2 = Array.from(a1,x=>x**2);
console.log(a2);//[1,4,9,16];

1.3.2 of( )用于将一组参数转换为数组实例

//把一组参数转换为数组
console.log(Array.of(1,2,3,4));//[1,2,3,4]

二、数组常用方法

2.1 复制和填充

批量复制方法 copyWithin() ,以及填充数组方法 fill() 。这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。使用这个方法不会改变数组的大小。

2.1.1 copyWithin( )

copyWithin() 用于批量复制,会按照指定范围浅复制数组中的部分内容,然后将它们插入到指定索引开始的位置。

let ints = [0,1,2,3,4,5,6,7,8,9];//从ints中复制索引0开始的内容,插入到索引5开始的位置
//在源索引或目标索引到达数组边界时停止
ints.copyWithin(5);
console.log(ints);//[0,1,2,3,4,0,1,2,3,4];//从ints中复制索引5开始的内容,插入到索引0开始的位置
ints.copyWithin(0,5);
console.log(ints);//[5,6,7,8,9,5,6,7,8,9];//从ints中复制索引0开始到索引3结束的内容
//插入到索引4开始的位置
ints.copyWithin(4,0,3);
console.log(ints);//[0,1,2,3,0,1,2,7,8,9];//JavaScript引擎在插值前会完整复制范围内的值
//因此复制期间不存在重写的风险
ints.copyWithin(2,0,6);
console.log(ints);//[0,1,0,1,2,3,4,5,8,9];//支持负索引值,与fill()相对于数组末尾计算正向索引的过程是一样的
ints.copyWithin(-4,-7,-3);
console.log(ints);//[0,1,2,3,4,5,3,4,5,6];

2.1.2 fill( )

使用 fill() 方法主要用于填充数组,可以向一个已有的数组中插入全部或部分相同的值。

const zeroes = [0,0,0,0,0];//用5填充整个数组
zeroes.fill(5);
console.log(zeroes);//[5,5,5,5,5];//用6填充索引大于等于3的元素
zeroes.fill(6,3);
console.log(zeroes);//[0,0,0,6,6];//用7填充索引大于等于1且小于3的元素
zeroes.fill(7,1,3)
console.log(zeroes);//[0,7,7,0,0];//用8填充索引大于等于1且小于等于4的元素
//(-4 + zeroes.length = 1)
//(-1 + zeroes.length = 4)
zeroes.fill(8,-4,-1);
console.log(zeroes);//[0,8,8,8,0];

2.2 数组转换

2.2.1 toString( )

toString() 用于数组转字符串方法,返回有数组中每个值的等效字符串拼接而成的一个逗号分隔字符串。

//创建一个包含3个字符串的数组
let colors = ["red","blue","green"];
console.log(colors.toString());//red,blue,green

2.2.2 valueOf( )

valueOf() 返回的还是数组本身。

//创建一个包含3个字符串的数组
let colors = ["yellow","orange","pink"];
console.log(colors.valueOf());//yellow,orange,pink

2.2.3 join( )

join() 方法接收一个参数,即字符串分隔符,返回包含所有项的字符串。

let colors = ["red","green","blue"];
console.log(colors.join(",");//red,green,blue
console.log(colors.join("||");//red||green||blue

2.3 栈方法(后进先出)

栈是一种后进先出的结构,也就是最近添加的项先被删除。数据项的插入(称为推入,push)和删除(称为弹出,pop)只在栈的一个地方发生,即栈顶。

2.3.1 push( )

push() 方法接受任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度。

//创建一个数组
let colors = new Array();
//推入两项
let count = colors.push("red","green");
//返回值 colors数组的最新长度:2
console.log(count);

2.3.2 pop( )

pop( ) 方法则用于删除数组的最后一项,同时减少数组的 length 值,返回被删除的项。

//获取最后一项
let item = colors.pop();
//返回值 "green"
console.log(item);
//返回数组长度 1
console.log(colors.length);

2.4 队列方法(先进先出)

队列以先进先出形式限制访问。队列在列表末尾添加数据,但从列表开头获取数据。使用shift()push() 可以把数组当成队列来使用。

2.4.1 shift( )

shift() 方法会删除数组的第一项并返回它,然后数组长度减1。

//创建一个数组
let colors = new Array("red","yellow","green");
//取得第一项
let item = colors.shift();
//返回值 "red"
console.log(item);
//数组长度 2
console.log(item.length);

2.4.2 unshift( )

unshift() 方法可以在数组开头添加任意多个值,然后返回新的数组长度。

//创建一个数组
let colors = new Array("yellow");
//数组头推入两个元素
let count = colors.unshift("red","blue");
//返回值 最新数组长度为3
console.log(count);
//返回值 ["red","blue","yellow"]
console.log(colors);

2.5 排序方法

数组有两个方法可以用来对元素重新排序:reverse()sort()

2.5.1 reverse( )

reverse() 用于将数组元素反向排序。

let values = [1,2,3,4,5];
values.reverse();
console.log(values);//[5,4,3,2,1]

2.5.2 sort( )

sort() 用于数组元素数值 升序\降序 排序。

//升序
let arr = [11,24,23,13,2]
arr.sort(function (a,b) {return a-b
})
console.log(arr);//[2,11,13,23,24]
//降序
let arr = [11,24,23,13,2]
arr.sort(function (a,b) {return a-b
})
console.log(arr);//[2,11,13,23,24]

2.6 操作方法

2.6.1 concat( )

concat() 方法可以在现有数组全部元素基础上创建一个新数组。它首先会创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回这个新构建的数组。如果传入一个或多个数组,则 concat() 会把这些数组的每一项都添加到结果数组。如果参数不是数组,则直接把它们添加到结果数组末尾。

let colors = ["red","green","blue"];
let colors2 = colors.concat("yellow",["black","brown"]);console.log(colors);//["red","green","blue"];
console.log(colors2);//["red","green","blue","yellow","black","brown"];

2.6.2 slice( )

slice() 用于创建一个包含原有数组中一个或多个元素的新数组。

slice() 方法可以接收一个或两个参数:返回元素的开始索引和结束索引。如果只有一个参数,则slice() 会返回该索引到数组末尾的所有元素。如果有两个参数,则slice() 返回从开始索引到结束索引对应的所有元素,其中不包含结束索引对应的元素。

💯注意:这个操作不影响原始数组。

let colors = ["red","green","blue","yellow","purple"];
let colors2 = colors.slice(1);
let colors3 = colors.slice(1,4);console.log(colors2);//green,blue,yellow,purple
console.log(colors3);//green,blue,yellow

2.6.3 splice( )

splice() 的主要目的是在数组中** 插入元素**,但是有3种不同的方式使用这个方法。

  • 删除:需要给splice() 传2个参数:要删除的第一个元素的位置和要删除的元素数量。可以从数组中删除任意多个元素,比如splice(0,2) 会删除前两个元素。
  • 插入:需要给splice() 传3个参数:开始位置、0(要删除的元素数量)和要插入的元素,可以在数组中指定的位置插入元素。第三个参数折后还可以传递多个要插入的元素。比如,splice(2,0,"red","green") 会从数组位置2开始插入字符串"red"和"green"。
  • 替换splice() 在删除元素的同时可以在指定位置插入新元素,同样要传入3个参数:开始位置、要删除元素的数量和要插入的任意多个元素。要插入的元素数量不一定跟删除的元素数量一致。比如,splice(2,1,"red","green") 会在位置2删除一个元素,然后从该位置开始向数组中插入"red"和"green" 。
//删除数组元素
let colors = ["red","green","blue"];
let removed = colors.splice(0,1);//删除第一项
console.log(colors);//["green","blue"]
console.log(removed);//["red"]//插入数组元素
colors.splice(1,0,"yellow","orange");
console.log(colors);//["green","yellow","orange","blue"]//替换数组元素
colors.splice(1,1,"red","purple")
console.log(colors);//["green","red","purple","orange","blue"]

2.7 搜索和位置方法

indexOf()lastIndexOf() 都返回要查找的元素在数组中的位置,如果没找到则返回-1。includes() 返回布尔值,表示是否至少找到一个与指定元素匹配的项。

2.7.1、indexOf( )

indexOf() — 从头搜索,返回数组下标

let numbers = [1,2,3,4,5,4,3,2,1];
//从数组最后项开始查找元素"4",返回下标为5
console.log(numbers.lastIndexOf(4));
//从数组numbers.length - 4项开始查找元素"4",返回下标为3
console.log(numbers.lastIndexOf(4,4));

2.7.2 lastIndexOf( )

lastIndexOf() — 从后搜索,返回数组下标

let numbers = [1,2,3,4,5,4,3,2,1];
//从数组最后项开始查找元素"4",返回下标为5
console.log(numbers.lastIndexOf(4));
//从数组numbers.length - 4项开始查找元素"4",返回下标为3
console.log(numbers.lastIndexOf(4,4));

2.7.3 includes( )

includes() — 从头搜索,返回布尔值

let numbers = [1,2,3,4,5,4,3,2,1];
//从数组第0项开始查找元素"4",返回true
console.log(numbers.includes(4));
//从数组第4项开始查找元素"4",返回false
console.log(numbers.includes(4,7));

2.8 迭代方法

🎯注意:以下方法都 不改变 调用它们的数组。

2.8.1 every( )

对数组每一项都运行传入的函数,如果对每一项函数都返回 true ,则这个方法返回 true

let numbers = [1,2,3,4,5,4,3,2,1];
let everyResult = numbers.every((item,index,array)=>item>2);
console.log(everyResult);//false

2.8.2 filter( )

对数组每一项都运行传入的函数,函数返回 true 的项会组成数组之后返回。

let numbers = [1,2,3,4,5,4,3,2,1];
let filterResult = numbers.filter((item,index,array)=>item>2);
console.log(filterResult);//[3,4,5,4,3]

2.8.3 forEach( )

对数组每一项都运行传入的函数,没有返回值。

let numbers = [1,2,3,4,5,4,3,2,1];
numbers.forEach((item,index,array)=>{//执行某些操作
})

2.8.4 map( )

对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组。

let numbers = [1,2,3,4,5,4,3,2,1];
let mapResult = numbers.map((item,index,array)=>item*2);
console.log(mapResult);//[2,4,6,8,10,8,6,4,2]

2.8.5 some( )

对数组每一项都运行传入的函数,如果有一项函数返回 true,则这个方法返回 true

let numbers = [1,2,3,4,5,4,3,2,1];
let everyResult = numbers.some((item,index,array)=>item>2);
console.log(someResult);//true

三、总结

JavaScript 数组在我们日常开发中使用频率极高,如果能数量掌握数组相关方法的使用,可以使我们开发效率事半功倍,而且还能写出高质量优雅的代码。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot项目部署至linux

1.修改pom.xml 确认是否有以下代码&#xff0c;没有请进行添加&#xff0c;mainClass改成你的启动类 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…

STM32+WIFI获取网络时间+8位数码管显示+0.96OLED显

资料下载地址&#xff1a;STM32WIFI获取网络时间8位数码管显示0.96OLED 1、项目介绍 主控芯片STM32C8T6 接线&#xff1a;串口1&#xff1a;PA9 PA10 OELD &#xff1a;PB6 PB7 数码管使用&#xff1a;MAX7219 8位数码管 Max7219_pinCLK PAout(5) Max7219_pinC…

1688平台商品关键词搜索的多样性与Python爬虫应用实践

在当今这个信息化、数字化飞速发展的时代&#xff0c;电子商务平台已经成为人们日常生活中不可或缺的一部分。而1688作为国内知名的B2B电商平台&#xff0c;凭借其庞大的商品种类和丰富的供应链资源&#xff0c;为无数商家和消费者提供了便捷的交易渠道。除了广受关注的女装品类…

记录将springboot的jar包和lib分离,使用docker-compose部署

本文讲诉如何把jar里的lib依赖包独立出来&#xff0c;方便更新服务时&#xff0c;缩小jar的体积&#xff0c;下面以若依的system服务为例&#xff0c;配置中的路径请酌情修改&#xff0c;主要提供大致配置逻辑 第一步&#xff1a;修改项目的pom.xml&#xff0c;调整build的配…

数据库(3)--针对列的CRUD操作

1.Create 新增 语法&#xff1a; insert into 表名 &#xff08;列名&#xff09;values &#xff08;列&#xff09;... 创建一个学生表用于演示&#xff1a; create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…

【设计模式-1】软件设计模式概述

1. 软件设计模式的产生背景 “设计模式”这个术语最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977 年&#xff0c;美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大&#xff08;Christopher Alexander&#xff09;在…

Python爬虫基础——认识网页结构(各种标签的使用)

1、添加<div>标签的代码定义了两个区块的宽度和高度均为100px&#xff0c;边框的格式也相同&#xff0c;只是区块中显示的内容不同&#xff1b; 2、添加<ul>和<ol>标签分别用于定义无序列表和有序列表。<il>标签位于<ul>标签或<ol>标签之…

Spring boot接入xxl-job

Spring boot接入xxl-job 导入maven包加入配置增加配置类创建执行器类&#xff08;写job的业务逻辑&#xff09;去控制台中配置job 导入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…

去掉el-table中自带的边框线

1.问题:el-table中自带的边框线 2.解决后的效果: 3.分析:明明在el-table中没有添加border,但是会出现边框线. 可能的原因: 由 Element UI 的默认样式或者表格的某些内置样式引起的。比如,<el-table> 会通过 border-collapse 或 border-spacing 等属性影响边框的显示。 4…

空间不足导致Oracle集群内存使用率暴增

一、现象 操作系统内存使用率告警&#xff0c;已达到98%,&#xff0c;告警内容如下&#xff1a; 【全景监控&#xff1a;Oracle主机内存使用监控】 【主机名】&#xff1a;XXXXX11 【主机IP】主机IP&#xff1a;*.126.15 【告警内容】当前内存使用率为98.9%&#xff0c;超警…

spark汇总

目录 描述运行模式1. Windows模式代码示例 2. Local模式3. Standalone模式 RDD描述特性RDD创建代码示例&#xff08;并行化创建&#xff09;代码示例&#xff08;读取外部数据&#xff09;代码示例&#xff08;读取目录下的所有文件&#xff09; 算子DAGSparkSQLSparkStreaming…

React中的合成事件

合成事件与原生事件 区别&#xff1a; 1. 命名不一样&#xff0c;原生用纯小写方式&#xff0c;react用小驼峰的方式 原生&#xff1a;onclick React的&#xff1a;onClick 2. 事件处理函数的写法不一样 原生的是传入一个字符串&#xff0c;react写法传入一个回调函数 3.…

CSS——26. 伪元素2(“::before ,::after”)

::before伪类 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>伪元素</title><style type"text/css">div::before{content: "我最棒";}}</style></head><body><!--…

Openssl1.1.1s rpm包构建与升级

rpmbuild入门知识 openssh/ssl二进制升级 文章目录 前言一、资源准备1.下载openssh、openssl二进制包2.安装rpmbuild工具3.拷贝源码包到SOURCES目录下4.系统开启telnet&#xff0c;防止意外导致shh无法连接5.编译工具安装6.补充说明 二、制作 OpenSSL RPM 包1.编写 SPEC 文件2.…

patchwork++地面分割学习笔记

参考资料&#xff1a;古月居 - ROS机器人知识分享社区 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分内容&#xff1a;提出了以下四个部分&#xff1a;RNR、RVPF、A-GLE 和 TGR。 1&#xff09;基于 3D LiDAR 反射模型的反射噪声消除 (RNR)&#xff…

基于Spring Boot的海滨体育馆管理系统的设计与实现

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 宠物医院…

通过Android Studio修改第三方jar包并重新生成jar包

最近接手了来自公司其他同事的一个Unity项目,里面有一个封装的jar包要改动一下,无奈关于这个jar包的原工程文件丢失了,于是自己动手来修改下jar包,并做下记录。 一、导入第三方jar包 1、新建项目EditJarDemo(项目名随便取) 2、新建libs文件夹,把你要修改的third.jar 复制…

计算机网络之---物理层设备

什么是物理层设备 物理层设备是指负责数据在物理媒介上传输的硬件设备&#xff0c;它们主要处理数据的转换、信号的传输与接收&#xff0c;而不涉及数据的内容或意义。常见的物理层设备包括网卡、集线器、光纤收发器、调制解调器等。 物理层设备有哪些 1、网卡&#xff08;N…

flink的EventTime和Watermark

时间机制 Flink中的时间机制主要用在判断是否触发时间窗口window的计算。 在Flink中有三种时间概念&#xff1a;ProcessTime、IngestionTime、EventTime。 ProcessTime&#xff1a;是在数据抵达算子产生的时间&#xff08;Flink默认使用ProcessTime&#xff09; IngestionT…

Ubuntu 下测试 NVME SSD 的读写速度

在 Ubuntu 系统下&#xff0c;测试 NVME SSD 的读写速度&#xff0c;有好多种方法&#xff0c;常用的有如下几种&#xff1a; 1. Gnome-disks Gnome-disks&#xff08;也称为“Disks”&#xff09;是 GNOME 桌面环境中的磁盘管理工具&#xff0c;有图形界面&#xff0c;是测试…