深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

目录

深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

一、引言:为什么要使用Array.find()

二、Array.find()的使用与技巧

1、基础语法

2、返回值

3、使用技巧

三、Array.find()的优势与实际应用案例

1、利用返回引用的优势修改数据

2、查找嵌套数据

 3、动态条件查找

四、总结


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等

---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

一、引言:为什么要使用Array.find()

        在 JavaScript 中,Array.find 是一个高效且易用的数组查找方法。和其他遍历方法(如 Array.forEach 和 Array.filter)相比,Array.find 不仅能更简洁地找到符合条件的第一个元素,还具有一个重要的性能优势:它返回的元素是原数组中的引用。通过这个引用,我们可以直接修改原数组中的特定元素,使得代码更加简洁和高效。

        可以说,但凡需要修改数组数据中任何一个特定的元素,都可以使用Array.find()来实现,而且比任何其他方法都要更简单便捷。

        举个例子,如果要将数据中名为“Bob”的人的role修改为“admin”。

        用循环是这样的:

// forEach循环
users.forEach(user => {if (user.name === 'Bob') {user.role = 'admin';}
});// for循环
for (let i = 0; i < users.length; i++) {if (users[i].name === 'Bob') {users[i].role = 'admin';break; // 找到后退出循环}
}

         炫技偏门一点的可以使用filter或map等:

// 使用map方法
const updatedUsers = users.map(user => {if (user.name === 'Bob') {return { ...user, role: 'admin' };}return user;
});
// 现在 updatedUsers 包含更新后的数据,原 users 数组不变// 使用filter方法
const updatedUsers = users.filter(user => {if (user.name === 'Bob') {return { ...user, role: 'admin' };}return user;
});
// 现在 updatedUsers 包含更新后的数据,原 users 数组不变

        但是使用find就会特别清爽,简洁,如果确定Bob这个人存在,if判断也不需要了,更简单:

const bob = users.find(user => user.name === 'Bob');
if (bob) {bob.role = 'admin';
}// 如果确定Bob存在
const bob = users.find(user => user.name === 'Bob');
bob.role = 'admin';

        本文将深入探讨 Array.find 的工作原理和优势,展示各种实用场景,帮助大家更好地掌握这个强大的数组处理工具。

二、Array.find()的使用与技巧

1、基础语法

        Array.find() 方法用于遍历数组,返回第一个符合条件的元素。如果没有找到符合条件的元素,则返回 undefined。以下是其基本语法:

const result = array.find(callback(element[, index[, array]])[, thisArg]);

        其中callback 是一个函数,接收三个参数:

  • element:当前遍历的元素。
  • index(可选):当前元素的索引。
  • array(可选):调用 find 方法的数组。

        thisArg 可选,用作 callback 的 this 值。

2、返回值

        如果查找到对应的元素且该元素为对象或数组,返回的就是原数据中该元素的引用值。此时修改该元素,就会同步修改原数据中该元素的对应数值。

        如果数组的元素不是对象或数组?那用Array.find()函数干什么?为什么不直接用Array.includes()呢?

3、使用技巧

        可以说使用Array.find()函数的目的,就是为了修改数组中某个对象/数组元素中的值。“find”的目的是“修改”。如果是其他情形还是其他的Array方法更好用。

三、Array.find()的优势与实际应用案例

1、利用返回引用的优势修改数据

        与其他数组处理方法不同,Array.find() 返回的是原数组中的元素引用。借助这一特性,我们可以直接修改找到的元素的内容,且修改会同步到原数组。这是最基础的用法。

        假设我们有一个用户列表,需要更新特定用户的属性,Array.find() 是一个理想的选择。

const users = [{ id: 1, name: 'Alice', role: 'user' },{ id: 2, name: 'Bob', role: 'user' },
];const userToUpdate = users.find(user => user.id === 2);
if (userToUpdate) {userToUpdate.role = 'admin';
}console.log(users);
// 输出:[{ id: 1, name: 'Alice', role: 'user' }, { id: 2, name: 'Bob', role: 'admin' }]

        在库存管理中,我们可以使用 Array.find() 查找特定商品,并直接更新其数量或价格等信息,避免创建新的数组。

const inventory = [{ sku: 'A1', name: 'Widget', quantity: 100 },{ sku: 'B2', name: 'Gadget', quantity: 50 },
];const item = inventory.find(i => i.sku === 'B2');
if (item) {item.quantity += 20; // 增加数量
}console.log(inventory);
// 输出:[ { sku: 'A1', name: 'Widget', quantity: 100 }, { sku: 'B2', name: 'Gadget', quantity: 70 } ]

        Array.find() 的这种行为在处理需要更新的数组对象时尤其方便。通过引用,我们可以避免创建新的数组,减少内存消耗,并提高性能。

2、查找嵌套数据

        Array.find()可以与递归函数结合,用于嵌套对象数组的查找。

const categories = [{id: 1,name: 'Electronics',subcategories: [{ id: 2, name: 'Laptops' },{ id: 3, name: 'Phones' },],},{id: 4,name: 'Clothing',subcategories: [{ id: 5, name: 'Men' },{ id: 6, name: 'Women' },],},
];function findCategory(categories, id) {for (const category of categories) {if (category.id === id) return category;if (category.subcategories) {const found = findCategory(category.subcategories, id);if (found) return found;}}return null;
}console.log(findCategory(categories, 3)); // 输出:{ id: 3, name: 'Phones' }

 3、动态条件查找

        我们可以通过组合条件动态使用 Array.find(),实现灵活的数据查找。

const employees = [{ id: 1, name: 'Alice', department: 'HR', status: 'active' },{ id: 2, name: 'Bob', department: 'IT', status: 'inactive' },{ id: 3, name: 'Charlie', department: 'Sales', status: 'active' },
];function findEmployee(criteria) {return employees.find(emp => {return Object.keys(criteria).every(key => emp[key] === criteria[key]);});
}console.log(findEmployee({ department: 'IT', status: 'inactive' }));
// 输出:{ id: 2, name: 'Bob', department: 'IT', status: 'inactive' }

四、总结

        Array.find() 是 JavaScript 数组方法中一个非常实用和强大的工具。它不仅提供了简洁的查找操作,还具有性能上的独特优势:返回的引用能够直接影响原数组的数据内容,使得数据更新更加高效。通过各种场景的展示,我们可以看到 Array.find() 在更新、条件查找和嵌套结构查找等场景中的广泛应用。

        在实际开发中,掌握 Array.find() 的特性和使用技巧,可以让代码更加简洁高效,特别是在需要直接修改原数据内容的情形。

        只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        其他热门文章,请关注:

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

        Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

        在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南

        干货含源码!如何用Java后端操作Docker(命令行篇)

        Idea启动SpringBoot程序报错:Port 8082 was already in use;端口冲突的原理与解决方案

        PDF预览:利用vue3-pdf-app实现前端PDF在线展示

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

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

相关文章

安全、便捷、效率高,明达边缘计算网关助力制药装备企业远程调机

随着药厂对设备运维需求的增长&#xff0c;制药装备企业需要在提高运维效率的同时&#xff0c;降低人工及差旅成本。制药装备因其数据具有高度的保密性&#xff0c;要求运维工程师提供安全可靠的远程调试方式。本案例介绍了明达技术MBox20系列5口WIFI通用网关在制药装备上的应用…

HBase 开发:使用Java操作HBase

1、实战简介 HBase和Hadoop一样&#xff0c;都是用Java进行开发的&#xff0c;本次实训我们就来学习如何使用Java编写代码来操作HBase数据库。 实验环境&#xff1a; hadoop-2.7 JDK8.0 HBase2.1.1 2、任务 1、第1关&#xff1a;创建表 package step1; import java.io.IOE…

vulhub之log4j

Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 漏洞简介 Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码。 Apache Log4j 在应用程序中添加日志记录最…

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记&#xff1a;学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

Ubuntu22.04基于ROS2-Humble安装moveit2教程(亲测)

一、安装ROS2-Humble 1、参考&#xff1a;Ubuntu22.04安装ROS2-humble-CSDN博客 2、确保安装完成 source /opt/ros/humble/setup.bash 方法一&#xff1a;二进制安装 sudo apt install ros-humble-moveit* 方法二&#xff1a;安装源码编译 一、卸载二进制安装包 sudo a…

一些常见网络安全术语

1、黑帽 为非法目的进行黑客攻击的人&#xff0c;通常是为了经济利益。他们进入安全网络以销毁&#xff0c;赎回&#xff0c;修改或窃取数据&#xff0c;或使网络无法用于授权用户。这个名字来源于这样一个事实&#xff1a;老式的黑白西部电影中的恶棍很容易被电影观众识别&…

ISCTF 2024 web

ISCTF 2024 web 小蓝鲨的冒险 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__); $a "isctf2024"; $b $_GET["b"]; parse_str($b); echo "小蓝鲨开始闯关&#xff0c;你能帮助他拿到flag吗?<br>"; if ($a…

AIGC----生成对抗网络(GAN)如何推动AIGC的发展

AIGC: 生成对抗网络(GAN)如何推动AIGC的发展 前言 随着人工智能领域的迅猛发展&#xff0c;AI生成内容&#xff08;AIGC&#xff0c;AI Generated Content&#xff09;正成为创意产业和技术领域的重要组成部分。在AIGC的核心技术中&#xff0c;生成对抗网络&#xff08;GAN&am…

删除k8s 或者docker运行失败的脚本

vi delete_exited_containers.sh#!/bin/bash# 列出所有停止的容器并存储到数组 list_exited_containers() {echo -e "\nStopped containers:"containers()# 获取停止的容器信息并存入数组while IFS read -r line; docontainers("$line")done < <(do…

如何在MindMaster思维导图中制作PPT课件?

思维导图是一种利用色彩、图画、线条等图文并茂的形式&#xff0c;来帮助人们增强知识或者事件的记忆。因此&#xff0c;思维导图也被常用于教育领域&#xff0c;比如&#xff1a;教学课件、读书笔记、时间管理等等。那么&#xff0c;在MindMaster免费思维导图软件中&#xff0…

【unity小技巧】一些unity3D灯光的使用与渲染及性能优化方案

文章目录 天空盒反射配置太阳耀斑眩光烘培光照烘培光照时弹出错误&#xff0c;记得勾选模型下面的选择阴影项目配置光源模型模型shader的问题 全局光照混合光照模式混合照明模式减性照明模式Shadowmask照明模式间接烘焙照明模式 环境光遮罩灯光探针反射探针技术关闭反射探针可以…

Linux :进程间通信之管道

一、进程间通信 1.1 是什么和为什么 1、进程间通信是什么&#xff1f;&#xff1f; ——>两个或多个进程实现数据层面的交互&#xff0c;但是由于进程独立性的存在&#xff0c;导致通信的成本比较高。 2、既然通信成本高&#xff0c;那为什么还要通信呢&#xff1f;&…

“乐鑫组件注册表”简介

当启动一个新的开发项目时&#xff0c;开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间&#xff0c;还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念&#xff0c;旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

ATmaga8单片机Pt100温度计源程序+Proteus仿真设计

目录 1、项目功能 2、仿真图 ​3、程序 资料下载地址&#xff1a;ATmaga8单片机Pt100温度计源程序Proteus仿真设计 1、项目功能 设计Pt100铂电阻测量温度的电路&#xff0c;温度测量范围是0-100摄氏度&#xff0c;要求LCD显示。画出电路图&#xff0c;标注元器件参数&am…

【代码pycharm】动手学深度学习v2-05 线性代数

课程链接-05 线性代数 可以先看完特定轴求和再去看p2 import torch xtorch.tensor([3.0]) ytorch.tensor([2.0]) #标量 print(1.标量只有一个元素&#xff1a;\n,xy,x*y,x/y,x**y) x2torch.arange(4) #向量 print(2.向量视为标量值组成的列表&#xff1a;\n,x2) print(3.访问张…

SpringBoot源码解析(四):解析应用参数args

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args 目录…

ZSTD 内存泄漏问题

优质博文&#xff1a;IT-BLOG-CN Zstandard&#xff08;简称zstd&#xff09;是一种无损压缩算法&#xff0c;由Facebook开发并开源。它旨在提供高压缩比和高解压速度的平衡&#xff0c;适用于多种数据压缩需求。 特点 【1】高压缩比&#xff1a; zstd能够在保持较高压缩比的…

前端:HTML (学习笔记)【1】

一&#xff0c;网络编程的三大基石 1&#xff0c;URL &#xff08;1&#xff09;url —— 统一资源定位符&#xff1a; 网址——整个互联网中可以唯一且准确的确定一个资源的位置。 【项目外】 网址——https://www.baidu.com/ …

【C++动态规划】3148. 矩阵中的最大得分|1819

本文涉及知识点 C动态规划 LeetCode 3148. 矩阵中的最大得分 给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格&#xff08;不必相邻&#xff09;。从值为 c1 的单元格移动到值为 c2 的单元格的得…

STM32完全学习——使用标准库点亮LED

一、使用标准库建立工程 &#xff08;1&#xff09;首先我们在ST的网站上面&#xff0c;下载标准库 &#xff08;2&#xff09;将标准外设库加入到项目中 我们一般只会使用到红色标注的那个文件夹&#xff0c;我们一般也只会将这个文件夹导入到工程里面&#xff0c;其他的还有…