巧技拾遗 | JavaScript 中 Array.every 和 Array.map 的巧妙结合
这几天在跟着学一点 vue3 + TypeScript 中表单验证的实例,看到一个实现,觉得非常巧妙。
需求概述
我们有一个列表 funcArr
,里面存放函数,比如 funcArr = [ func1, func2, ... ]
。这些函数都是 () => boolean
即无参数、返回值为布尔值的。
我们期望在提交表单时,执行 funcArr
中的每一个函数,如果这些函数都通过验证,则我们的主逻辑获取到 true
,否则是 false
。
朴素版本
func1 = () => { console.log(1); return true; }
func2 = () => { console.log(2); return false; }
func3 = () => { console.log(3); return true; }
funcArr = [func1, func2, func3];
result = true;
for (var i = 0; i < funcArr.length; i ++ )
{
if (!funcArr[i]( "i")) result = false;
}
console.log(result)
输出是:
> 1
> 2
> 3
> false
这种做法显然有点瞎扯了,完全没有用到 JavaScript 特性和函数式编程的思想。
Array.prototype.every()
一般来讲,有上述需求,我们用 Array.prototype.every() 函数来解决。
根据 MDN 的描述:every
用于检测是否每个函数都通过,并且最终返回 一个 布尔值。
于是:
func1 = () => { console.log(1); return true; }
func2 = () => { console.log(2); return false; }
func3 = () => { console.log(3); return true; }
funcArr = [func1, func2, func3];
result = funcArr.every(func => func());
console.log(result)
输出:
> 1
> 2
> false
可以注意到一个现象:当every
发现有一个元素没有通过验证时,它就不再继续检查其他元素了。
结合 map()
有时候,我们的 funcArr
中的函数,不仅仅是单纯的返回一个布尔值,其中还有其他逻辑如修改一些响应式变量的作用。
因此,我们希望 every
能够执行完毕所有函数,即便发现其中某一个是 return false
了的。
考虑使用 map
。
func1 = () => { console.log(1); return true; }
func2 = () => { console.log(2); return false; }
func3 = () => { console.log(3); return true; }
funcArr = [func1, func2, func3];
result = funcArr.map(func => func()).every(res => res);
console.log(result)
输出:
> 1
> 2
> 3
> false
every
在其中的作用,像是一个漏斗,把所有的值依次过滤,有一个 false
就返回 false
,否则是 true
。
我是小拍,欢迎关注我,类似这种巧妙技巧的拾遗以后会经常更新哈。麻烦点下点赞和在看~
巧技拾遗 | JavaScript 中 Array.every 和 Array.map 的巧妙结合的更多相关文章
- Javascript中判断变量是 array还是object(是数组还是对象)
段文字是从github上截取由本人翻译过来的. 原文地址:https://github.com/nathansmith/javascript-quiz/blob/master/ANSWERS.md 怎 ...
- Javascript中数组与字典(即map)的使用
简述: 简单记录一下数据结构Map和数组, 其实在Javascript这种弱类型的脚本语言中,数组同时也就是字典,下面主要就是字典数组的简易使用 代码: 1. 数组中添加map <!DOCT ...
- javascript中some,every,map,filter是只用和ansyc中的each,eachLimit,map,mapLImit,filter的使用
var t = [1,2,3,4,5]; //some找到数组中第一个符合要求的值后就不在继续执行//用来判断数组中是否存符合要求的值,返回结果true|false//function返回类型为boo ...
- 深入了解 JavaScript 中的 for 循环
在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...
- javascript中数组常用的方法
在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法.数组是继承自Object的原型,并且他对typeof没有特殊的返回值,他只返回'object'. ...
- 深入了解JavaScript中的for循环
在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...
- JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )
ECMAScript 中的相等操作符由两个等于号 ( == ) 表示,如果两个操作数相等,则返回 true. 相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性. 在转换不同的数据类型 ...
- 好文:javascript中的四种循环
https://juejin.im/entry/5a1654e951882554b8373622?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...
- 【转】JavaScript 中值得注意的 for 循环
在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...
- JavaScript 中 for 循环
在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...
随机推荐
- Java新特性-stream流
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达 ...
- SLAM中的各种地图
1.地图的不同分类方式 地图有多种不同的分类方式,网上有不少帖子介绍各种各样的地图,但并没有非常完整的总结地图应该怎么分类.论文[1]中将地图分成以下几种:拓扑地图.度量地图.度量-语义地图和混合地图 ...
- 串(C语言实现)
文章目录 1.串的数据类型定义 数据对象 1.1 数据关系 1.2 基本操作 2.串的存储结构 2.1 串的顺序存储 2.2 串的链式存储 3.串的模式匹配算法 3.1BF 算法 3.2KMP 算法 ...
- CF#795 D - Max GEQ Sum O(n)做法
D - Max GEQ Sum input 3 4 -1 1 -1 2 5 -1 2 -3 2 -1 3 2 3 -1 output YES YES NO 题目大意:给你一个数组a,让你任意一个字段均 ...
- 搭建离线yum源
HTTP方式 安装步骤 系统:CentOS 7.6 yum install -y httpd vi /etc/httpd/conf/httpd.conf <Directory /> Opt ...
- ABP 接口访问变慢,缓存清理,请求超时
发布后过一个小时或者不久访问过慢 第一次访问慢,第二次访问变快 总结 发布后IIS 访问 过慢的原因考虑,IIS回收.缓存清理.去host项目里面配置缓存过期时间再去试验
- Linux-Centos安装配置
一.安装CentOs CentOS是Linux系统的一个发行版本,还有Ubuntu.Fedora.Debian等. 安装VMware虚拟机 官网地址:https://www.vmware.com/pr ...
- Navicat Premium 16下载与安装
1.可以通过以下两种方式下载 a.官网下载地址 https://www.navicat.com.cn/download/navicat-premium b.百度网盘下载地址 链接:https://pa ...
- 超聚变服务器2288H V6使用 iBMC 安装 Ubuntu Server 24.04 LTS及后续系统配置
一. 超聚变服务器iBMC远程管理 超聚变服务器的iBMC芯片集成了一个专用的管理GE网口,提供全面的故障诊断.自动化运维.硬件安全加固等管理特性.iBMC支持Redfish.SNMP.IPMI 2. ...
- 人形机器人-强化学习算法-PPO算法的实现细节是否会对算法性能有大的影响.
PPO算法是强化学习算法中目前应用最广的算法,虽然这个算法是2017年发表的,但是至今在整个AI领域下的agent子领域中这个算法都是最主要的强化学习算法(至少目前还没有之一),这个算法尤其在Chat ...