这几天在跟着学一点 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 的巧妙结合的更多相关文章

  1. Javascript中判断变量是 array还是object(是数组还是对象)

    段文字是从github上截取由本人翻译过来的. 原文地址:https://github.com/nathansmith/javascript-quiz/blob/master/ANSWERS.md 怎 ...

  2. Javascript中数组与字典(即map)的使用

    简述: 简单记录一下数据结构Map和数组, 其实在Javascript这种弱类型的脚本语言中,数组同时也就是字典,下面主要就是字典数组的简易使用   代码: 1. 数组中添加map <!DOCT ...

  3. javascript中some,every,map,filter是只用和ansyc中的each,eachLimit,map,mapLImit,filter的使用

    var t = [1,2,3,4,5]; //some找到数组中第一个符合要求的值后就不在继续执行//用来判断数组中是否存符合要求的值,返回结果true|false//function返回类型为boo ...

  4. 深入了解 JavaScript 中的 for 循环

    在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...

  5. javascript中数组常用的方法

    在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法.数组是继承自Object的原型,并且他对typeof没有特殊的返回值,他只返回'object'. ...

  6. 深入了解JavaScript中的for循环

    在ECMAScript5中,有三种for循环,分别是: 简单for循环 for-in forEach 在ES6中,新增了一种循环 for-of 简单for循环 const arr = [1, 2, 3 ...

  7. JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )

    ECMAScript 中的相等操作符由两个等于号 ( == ) 表示,如果两个操作数相等,则返回 true. 相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性. 在转换不同的数据类型 ...

  8. 好文:javascript中的四种循环

    https://juejin.im/entry/5a1654e951882554b8373622?utm_medium=hao.caibaojian.com&utm_source=hao.ca ...

  9. 【转】JavaScript 中值得注意的 for 循环

    在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...

  10. JavaScript 中 for 循环

    在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...

随机推荐

  1. manim边做边学--直角平面

    直角平面NumberPlane是Manim库中用于创建二维坐标平面的对象,它可以帮助用户在场景中可视化坐标轴以及网格线. 通过坐标轴.网格线以及刻度,它能够动态地展示函数曲线.几何图形以及它们的变换过 ...

  2. Saas多租户数据权限设计(参考RuoYi)

    导航 引子 场景梳理 基于角色的访问控制(RBAC) 多租户系统的权限设计 RuoYi系统的数据权限设计 最终设计方案 参考 本文首发<智客工坊-Saas多租户数据权限设计(参考RuoYi)&g ...

  3. Java高并发之线程的实现方式,含Lamabda表达式

    Java中线程实现的方式 在 Java 中实现多线程有4种手段: 1.继承 Thread 类 2.实现 Runnable 接口 3.匿名内部类 4.Lambda表达式实现 实现 Runnable 接口 ...

  4. Greenplum 通过外部表快速导入数据

    通过Greenplum外部表可以快速导入数据 create external table "public"."ext_tablename" ( like &qu ...

  5. 聊聊jvm的内存结构, 以及各种结构的作用

    什么是JVM 定义:Java Virtual Machine,JAVA程序的运行环境(JAVA二进制字节码的运行环境) 内存结构 JVM 内存布局规定了 Java 在运行过程中内存申请.分配.管理的策 ...

  6. 【2024.08.15】NOIP2024暑假集训模拟赛(13)

    [2024.08.15]NOIP2024暑假集训模拟赛(13) T1 先找能构成回文的最长前缀和后缀(长度相同的),然后在任意一边的基础上扩展,看能否接一个回文串. #include<bits/ ...

  7. RL 基础 | 如何使用 OpenAI Gym 接口,搭建自定义 RL 环境(详细版)

    参考: 官方链接:Gym documentation | Make your own custom environment 腾讯云 | OpenAI Gym 中级教程--环境定制与创建 知乎 | 如何 ...

  8. 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-4-启动浏览器-基于Maven(详细教程)

    1.简介 上一篇文章,宏哥已经在搭建的java项目环境中添加jar包实践了如何启动浏览器,今天就在基于maven项目的环境中给小伙伴们或者童鞋们演示一下如何启动浏览器. 2.eclipse中新建mav ...

  9. Flink CDC 实时同步 Oracle

    Flink CDC 系列文章 Flink CDC 实时同步 MySQL Flink CDC 实时同步 Oracle 准备工作 Oracle 数据库(version: 11g) 开启归档日志 sqlpl ...

  10. 成本立降50%!在EKS上借助Karpenter部署大模型

    原文链接: https://aws.amazon.com/cn/blogs/containers/scaling-a-large-language-model-with-nvidia-nim-on-a ...