前端开发中有哪些常用的数组操作方法?

news2024/11/18 16:51:01

javascript数组

简介

JavaScript 数组用于在单一变量中存储多个值。

JavaScript数组是无类型的,数组元素可以是任意类型,并且同一个数组中元素类型也可以不同。

实例

var cars = ["Saab", "Volvo", "BMW"];

什么是数组?

数组是一种特殊的变量,它能够一次存放一个以上的值。

如果您有一个项目清单(例如,汽车品牌列表),在单个变量中存储汽车品牌应该是这样的:

var car1 = "Saab";
var car2 = "Volvo";
var car3 = "BMW"; 

不过,假如您希望遍历所有汽车并找到一个特定的值?假如不是三个汽车品牌而是三百个呢?

解决方法就是数组!

数组可以用一个单一的名称存放很多值,并且还可以通过引用索引号来访问这些值。

数组常用方法

  • 一、操作方法

      • push()
      • unshift()
      • splice
      • concat()
      • pop()
      • shift()
      • splice()
      • slice()
      • splice()
      • indexOf()
      • includes()
      • find()
  • 二、排序方法

    • reverse()
    • sort()
  • 三、转换方法

    • join()
  • 四、迭代方法

    • some()
    • every()
    • forEach()
    • filter()
    • map()

更多详细内容,请查看 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

React中常用数组方法

在react中,或者说在前端对于数组的操作中,常用的几个比较复杂的数组操作方法基本有如下几类:

  • 遍历
  • 过滤
  • 筛选

forEach()

遍历每⼀个对象

foreach会从头到尾对数组里的每个元素遍历一遍 ,不会生成新数组,也不改变原数组

回调函数接收三个值,分别是 数组的元素,索引和当前数组

let arr = ["a","b","c","d"]
arr.forEach((el,index,array) => {
    if(el == "b" ) return
    console.log(el,index,array)
})

let ids = [];
dataSource.forEach(x => {
    ids.push(x.id);
}) 

filter()

filter为过滤的意思,也就是说它会把满足条件的元素拿出来形成一个**新的数组**

过滤数据

const dataSource= [
    {id:'00011', name: '燃气具1'},
    {id:'00012', name: '净水器1'},
    {id:'00013', name: '大家电1'},
    {id:'00014', name: '厨房小店1'},
    {id:'00015', name: '生活电器1'},
    {id:'00016', name: '配件1'}
];
const newData = dataSource.filter(v => v.id!=='00011)

过滤数组中不存在的字段,并进行拼接

addressName: [
    provinceName,
    cityName,
    detailaddr,
    contPerson,
    tel,
]
.filter(Boolean)  //过滤掉为null的字段
.join('/'),   //每个字段之间用  /  进行拼接

显示效果:  河南/洛阳/131.....

巧妙的运用filter去除数组中重复的元素:

let phone = ['苹果','锤子','三星','华为','锤子','苹果','小米','锤子']
let result = phone.filter((el,index,arr) => {
  return arr.indexOf(el) == index
})
console.log(result)

map()

和foreach类似,map也会把数组的每一项都遍历一遍,

他会返回一个新数组,但是原数组保持不变,

值得注意的是,map不会对空数组进行检测

checkAll = () => {
    const {todos} = this.state
    const newTodo = todos.map((todo) => { 
        return {...todo, done: true}
    })
​
    this.setState({todos: newTodo})
}

filter VS map

相同点:filter 和 map 都是对数组的操作,均返回一个新的数组,filter()不会改变原始数组,map()同样不会改变原数组

不同点

  • filter是满足条件的留下,是对原数组的过滤
  • map则是对原数组的加工 [返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组],映射成一对一映射的新数组

some()

遍历数组的每一项,若其中一项为 true,则返回true;

let arr = [1, 2, 3];
let result = arr.some((item, index, arr) => {
    return item < 2;
})
console.log(result) // true

every()

测试一个数组内的所有元素是否都能通过某个指定函数的测试

如果所有数组项都满足条件则返回true。

它返回一个布尔值。

let arr = [1, 2, 3];
let result = arr.every((item, index, arr) => {
    return item < 2;
})
console.log(result) // false
const isFlag = (currentValue) => currentValue < 40;
const array1 = [1, 30, 39, 29, 10, 13];
console.log(array1.every(isFlag)); // true

find()

找到满足条件的数据:找到返回true,否则undefined

var ages = [3, 10, 18, 20];
 
function checkAdult(age) {
    return age >= 18;
}
 
function myFunction() {
    document.getElementById("demo").innerHTML = ages.find(checkAdult);
} 

myFunction() // 18

includes()

用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false。

const arr = ['a','b','c','d']
console.log(arr.includes('a'),arr.includes('e')); 
//   结果 true,false

split()

用于把一个字符串分割成字符串数组。

var b = "f-ff-gg-ll-kkk";
var c = b.split("-",3);
console.log(c);
//["f", "ff", "gg"]

总结与扩展

map()
    - 可以根据原有数组返回一个新数组
    - 需要一个回调函数作为参数,回调函数的返回值会成为新数组中的元素
    - 回调函数中有三个参数:
        第一个参数:当前元素
        第二个参数:当前元素的索引
        第三个参数:当前数组

filter()
    - 可以从一个数组中获得符和条件的元素
    - 会根据回调函数的结果来决定是否保留元素,true保留,false不保留

find()
    - 可以从一个数组中获得符和条件的第一个元素

以上数组方法是在开发过程中经常使用的几个而已,肯定还有其他部分,这里不一一列举。

参考文档

  • https://www.w3school.com.cn/js/js_arrays.asp
  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array
  • https://blog.csdn.net/qq_50059788/article/details/115126140
  • https://www.cnblogs.com/qisi007/p/9973887.html

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

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

相关文章

探索【Stable-Diffusion WEBUI】的插件:画布扩绘(Outpaint)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;局部重绘&#xff08;Inpaint&#xff09;&#xff08;二&#xff09;画布扩绘&#xff08;Outpaint&#xff09;&#xff08;2.1&#xff09;图片画布扩大&#xff08;插件&#xff1a;OpenOutpaint&#x…

回炉重造九---DNS服务器

1、DNS服务器的相关概念和技术 1.1 DNS服务器的类型 主DNS服务器从DNS服务器缓存DNS服务器&#xff08;forward DNS服务器{转发器}&#xff09; 1.1.1 主DNS服务器的作用 管理和维护所负责解析的域内解析库的服务器1.1.2 从DNS服务器的作用 从主服务器或从服务器“复制”解…

检测并打印C++编译器支持的feature(附Visual Studio 2022和gcc-12测试、对比结果)

C标准快速迭代&#xff0c;不同的系统平台和编译器对C各种新功能的支持不同&#xff0c;通过这个程序可以测试所用编译器对各个版本C的支持情况。另一方面&#xff0c;可以在代码中通过这些宏针对不同版本编写不同的代码分支。 源码下面附上Visual Studio 2022的测试结果&#…

32道子网划分习题详细解析

目录 1 子网划分概念&#xff1a; 2 划分方法&#xff1a; 子网划分方法&#xff1a;段&#xff0c;块&#xff0c;数的计算三步。 段就是确定ip地址段中既有网络地址&#xff0c;又有主机地址的那一段是四段中的那一段&#xff1f; 块就确定上一步中确定的那一段中的主机…

【C语言】21-结构体

本文目录 • 一、什么是结构体 • 二、结构体的定义 • 三、结构体变量的定义 • 四、结构体的注意点 • 五、结构体的初始化 • 六、结构体的使用 • 七、结构体数组 • 八、结构体作为函数参数 • 九、指向结构体的指针 说明&#xff1a;这个C语言专题&#xff0c;是学习iOS开…

算法设计与智能计算 || 专题七: 主成分分析的统计学视角

主成分分析的统计学视角 文章目录 主成分分析的统计学视角PCA 的统计学视角1. 寻找第一个主成分2. 获取第二个主成分3. 非零均值随机变量的主元4. 零均值随机变量的样本主元5. PCA 降维案例 主成分分析是将高维空间中的数据集拟合成一个低维子空间的方法&#xff0c;到目前为止…

搞定常见八大排序

文章目录 注意事项插入排序插入排序希尔排序 分组预排序选择排序堆排序直接选择排序(最拉胯的排序) 交换排序冒泡排序快速排序1. hoare版本如何解决快排缺陷&#xff1f;2.挖坑法版本3.双指针法版本&#xff08;建议&#xff09;快排算法优化实现非递归快排 归并排序归并排序 非…

Rainbond 结合 Jpom 实现云原生 本地一体化项目管理

Jpom 是一个简而轻的低侵入式在线构建、自动部署、日常运维、项目运维监控软件。提供了&#xff1a; 节点管理&#xff1a;集群节点&#xff0c;统一管理多节点的项目&#xff0c;实现快速一键分发项目文件项目管理&#xff1a;创建、启动、停止、实时查看项目控制台日志&…

CentOS系统设置中文输入法,并切换输入法

1.点击Application—>System Tools—>Settings&#xff0c;选择Region&Language 2.在Input Sources中&#xff0c;选择左下角的“”&#xff0c;找到Chinese(Intelligent Pinyin)&#xff0c;选中后点击右上角的“add”即可 3.选择好后&#xff0c;就可以切换中英…

可口可乐如何管理其全球供应链

目录 &#xff08;一&#xff09;可口可乐供应链管理的核心组成部分 &#xff08;二&#xff09;可口可乐管理全球供应链的挑战 &#xff08;三&#xff09;可口可乐利用技术简化其供应链 转载自供应链星球 可口可乐在200多个国家和地区拥有约225家装瓶合作伙伴&#xff0c;并…

【李沐—AutoGluon背后的技术】

1.资料来源 AutoGluon背后的技术_哔哩哔哩_bilibili 也是一种Automl框架【在尽量不需要人的帮助下&#xff0c;对输入进行特征提取&#xff0c;选取适合的机器学习模型对它进行训练】。大部分基于超参数搜索技术【从数十或者数百个参数中选取一个合适的参数&#xff0c;媲美人…

vue插槽的使用

文章目录 前言默认插槽具名插槽作用域插槽 前言 插槽总共分为3类&#xff1a;默认插槽&#xff0c;具名插槽&#xff0c;作用域插槽 默认插槽 默认插槽只需要在子组件的新增一个slot标签&#xff0c;父组件的子组件标签的内容就是要插入的内容 父组件 <template v-bind…

mysql “order by”是怎么工作的?

开发应用的时候&#xff0c;一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们 前面举例用过的市民表为例&#xff0c;假设你要查询城市是“杭州”的所有人名字&#xff0c;并且按照姓名排序返回 前1000个人的姓名、年龄。 假设这个表的部分定义是这样的&…

【linux】基于单例模式实现线程池

文章目录 一、线程池1.1 池化的概念1.2 线程池的实现1.3 线程池的使用场景 二、单例模式2.1 单例模式概念2.2 单例模式的线程池2.3 防过度优化 三、源码 一、线程池 1.1 池化的概念 当我们处理任务的时候&#xff0c;一般就是来一个任务我们就创建一个线程来处理这个任务。这…

类实例化对象的存储与内存对齐,this指针与调用成员函数传参的本原面目(两种调用方式)

类的实例化对象的内存存储方式与内存对齐 对于类当中定义的成员函数&#xff0c;是放在公共代码区的&#xff0c;在公共代码区有类成员函数表。对于不同的实例化对象而言&#xff0c;它里面的各个成员变量都是不一样的&#xff0c;但是如果他们分别调用相同名字的成员函数&…

cmd切换壁纸 适用windows10

文章目录 代码代码讲解参考文章菜鸟的目录结构注意 昨天菜鸟上班但是真的没活干&#xff0c;闲着无聊&#xff0c;突然发现自己壁纸好久都是一个&#xff0c;看着真的烦了&#xff0c;但是下载一个壁纸软件又感觉实际用处不大还占着内存&#xff0c;所以菜鸟就想&#xff0c;要…

Java Type接口出现的原因以及它和泛型的关系

Java泛型很多人都用过&#xff0c;但是对于其中的原理可能很多人可能都不太清楚。 首先给出一个结论&#xff1a;Java的泛型是伪泛型&#xff0c;因为JVM在编译以后会将所有泛型参数擦除掉&#xff0c;这个就叫类型擦除。 下面用一段代码来证明&#xff0c;毕竟千言万语BB不如…

【软考数据库】第三章 数据结构与算法

目录 3.1 数据结构 3.1.1 线性结构 3.1.2 数组 3.1.3 矩阵 3.1.4 树与二叉树 3.1.5 图 3.2 查找 3.2.1 顺序查找 3.2.2 折半查找 3.2.3 哈希表 3.3 排序 3.3.1 直接插入排序 3.3.2 希尔排序 …

Win10任务栏卡死怎么办?这3个方法快收藏!

案例&#xff1a;win10任务栏卡死 【姐妹们&#xff0c;我的win10任务栏一直卡着&#xff0c;我完全没法使用计算机了&#xff0c;遇到这种情况&#xff0c;我应该怎么做呢&#xff1f;求大家给我支支招&#xff01;感谢感谢&#xff01;】 我们使用电脑的过程中&#xff0c;…

MyBatis的添加和简单使用

什么是MyBatis mybatis是一个方便我们更简单的操作数据库的框架&#xff0c;让我们不用再使用JDBC操作数据库。 MyBatis的创建 老项目添加mybatis&#xff0c;首先要安装好editstarters插件&#xff0c;然后在pom.xml中右键generate选择edit插件&#xff0c;注意不仅要添加m…