如何通过JavaScript提升逻辑判断的可读性?

news2024/11/24 16:31:12

69f16a92db655c0c7ce5b63889debb8a.jpeg

在前端开发过程中,我们经常会遇到需要根据不同条件执行不同逻辑的场景。对于初学者来说,这样的逻辑判断可能会导致代码冗长且难以维护。那么,如何才能写出既简洁又易读的代码呢?本文将带你逐步优化 JavaScript 中的条件判断,让你的代码变得更加优雅。

1. 初识逻辑判断的复杂性

在 JavaScript 编程中,条件判断是非常常见的操作。然而,当条件变得复杂时,代码中的 if/else 或 switch 语句会变得冗长且难以维护。我们来看看下面这个例子:

const handleButtonClick = (status) => {
  if (status === 1) {
    navigateTo('HomePage');
  } else if (status === 2 || status === 3) {
    navigateTo('ErrorPage');
  } else if (status === 4) {
    navigateTo('SuccessPage');
  } else if (status === 5) {
    navigateTo('CancelPage');
  } else {
    navigateTo('DefaultPage');
  }
}

在这个例子中,我们根据不同的状态码跳转到不同的页面。虽然逻辑清晰,但随着条件的增加,代码会变得越来越臃肿和难以维护。为了优化这种代码,我们需要探索更简洁的方法。

2. 利用 Switch 语句优化代码

我们可以通过 switch 语句来优化上述代码,使其更易读:

const handleButtonClick = (status) => {
  switch (status) {
    case 1:
      navigateTo('HomePage');
      break;
    case 2:
    case 3:
      navigateTo('ErrorPage');
      break;
    case 4:
      navigateTo('SuccessPage');
      break;
    case 5:
      navigateTo('CancelPage');
      break;
    default:
      navigateTo('DefaultPage');
  }
}

使用 switch 语句后,每种状态对应的处理逻辑更加直观,并且减少了重复代码。通过 switch,我们可以在一个更结构化的方式中处理多种条件。然而,随着条件的增加,switch 语句也会变得冗长。

3. 通过对象字面量提升代码可读性

将条件判断放入对象中是一个非常有效的优化方式:

const actions = {
  1: 'HomePage',
  2: 'ErrorPage',
  3: 'ErrorPage',
  4: 'SuccessPage',
  5: 'CancelPage',
  default: 'DefaultPage',
};

const handleButtonClick = (status) => {
  const action = actions[status] || actions.default;
  navigateTo(action);
}

在这个示例中,我们使用对象的键值对来存储状态和对应的页面。当按钮被点击时,通过访问对象属性来决定跳转到哪个页面。这种写法不仅简洁,而且更容易维护和扩展。我们可以通过对象的键值对快速找到对应的逻辑,而不需要写一大堆 if/else 或 switch 语句。

4. 引入 Map 对象进一步优化

我们还可以利用 ES6 的 Map 对象来实现相同的功能,Map 对象的键可以是任意类型,使用起来更加灵活:

const actions = new Map([
  [1, 'HomePage'],
  [2, 'ErrorPage'],
  [3, 'ErrorPage'],
  [4, 'SuccessPage'],
  [5, 'CancelPage'],
  ['default', 'DefaultPage'],
]);

const handleButtonClick = (status) => {
  const action = actions.get(status) || actions.get('default');
  navigateTo(action);
}

Map 对象允许使用任意类型的值作为键,这使得我们的代码更加灵活。我们可以通过调用 actions.get(status) 来获取对应的页面路径。如果状态值不存在,我们可以使用 actions.get('default') 获取默认值。这种方式不仅简洁,还可以避免一些键值对的冲突问题。

5. 处理多条件判断

当我们的逻辑升级为二元判断时,代码量会急剧增加,例如:

const handleButtonClick = (status, role) => {
  if (role === 'guest') {
    if (status === 1) {
      // do something for guest
    } else if (status === 2) {
      // do something for guest
    } // ... more conditions
  } else if (role === 'admin') {
    if (status === 1) {
      // do something for admin
    } else if (status === 2) {
      // do something for admin
    } // ... more conditions
  }
}

当有多个条件时,代码的复杂性会进一步增加。为了简化代码,我们可以通过 Map 并将条件拼接成字符串作为键:

const actions = new Map([
  ['guest_1', () => { /* do something for guest and status 1 */ }],
  ['guest_2', () => { /* do something for guest and status 2 */ }],
  // ... more mappings
  ['admin_1', () => { /* do something for admin and status 1 */ }],
  ['admin_2', () => { /* do something for admin and status 2 */ }],
  ['default', () => { /* default action */ }],
]);

const handleButtonClick = (role, status) => {
  const action = actions.get(`${role}_${status}`) || actions.get('default');
  action();
}

我们通过拼接字符串将角色和状态组合成键,并在 Map 中查找对应的处理函数。这种方式使代码更加简洁,易于维护和扩展。每个组合键对应一个特定的处理函数,避免了嵌套的 if/else 或 switch 语句。

6. 使用对象作为 Map 的键

如果将查询条件拼接成字符串感觉不太优雅,可以使用对象作为 Map 的键:

const actions = new Map([
  [{ identity: 'guest', status: 1 }, () => { console.log('Guest, status 1'); }],
  [{ identity: 'guest', status: 2 }, () => { console.log('Guest, status 2'); }],
  [{ identity: 'admin', status: 1 }, () => { console.log('Admin, status 1'); }],
  //...
]);

const handleButtonClick = (identity, status) => {
  // 将 Map 对象转换为数组并查找匹配的键值对
  const action = [...actions].find(([key]) => key.identity === identity && key.status === status);
  if (action) {
    // action[1] 是找到的键值对中的值(处理函数)
    action[1]();
  } else {
    console.log('Default action');
  }
}

// 测试调用
handleButtonClick('guest', 1);  // 输出: Guest, status 1
handleButtonClick('admin', 1);  // 输出: Admin, status 1
handleButtonClick('guest', 3);  // 输出: Default action

在这个例子中,我们将条件组合成对象,并使用这些对象作为 Map 的键。通过 find 方法,我们可以查找符合条件的键值对,并执行对应的处理函数。这种方法使代码更具可读性,并且更容易管理复杂的条件判断。

7. 使用正则表达式处理复杂条件

假设在某些场景下,我们需要在同一个身份下处理多个相同状态的逻辑,例如,对于 guest 的 status 1 到 4 处理逻辑相同,status 5 的处理逻辑不同:

const actions = () => {
  const functionA = () => { console.log('Guest, status 1-4'); };
  const functionB = () => { console.log('Guest, status 5'); };
  return new Map([
    [{ identity: 'guest', status: 1 }, functionA],
    [{ identity: 'guest', status: 2 }, functionA],
    [{ identity: 'guest', status: 3 }, functionA],
    [{ identity: 'guest', status: 4 }, functionA],
    [{ identity: 'guest', status: 5 }, functionB],
    //...
  ]);
}

const handleButtonClick = (identity, status) => {
  const action = [...actions()].find(([key]) => key.identity === identity && key.status === status);
  if (action) {
    action[1]();
  } else {
    console.log('Default action');
  }
}

// 测试调用
handleButtonClick('guest', 1);  // 输出: Guest, status 1-4
handleButtonClick('guest', 5);  // 输出: Guest, status 5
handleButtonClick('admin', 1);  // 输出: Default action

这种方法虽然能解决问题,但需要重复定义多个相同的逻辑。为了减少重复代码,可以利用正则表达式:

const actions = () => {
  const functionA = () => { console.log('Guest, status 1-4'); };
  const functionB = () => { console.log('Guest, status 5'); };
  return new Map([
    [/^guest_[1-4]$/, functionA],
    [/^guest_5$/, functionB],
   

 //...
  ]);
}

const handleButtonClick = (identity, status) => {
  const action = [...actions()].find(([key]) => key instanceof RegExp && key.test(`${identity}_${status}`));
  if (action) {
    action[1]();
  } else {
    console.log('Default action');
  }
}

// 测试调用
handleButtonClick('guest', 2);  // 输出: Guest, status 1-4
handleButtonClick('guest', 5);  // 输出: Guest, status 5
handleButtonClick('admin', 3);  // 输出: Default action

使用正则表达式作为键,我们可以更高效地处理多个相同逻辑的条件,避免重复定义相同的处理函数。这种方法不仅减少了代码量,还使得代码更具可读性和可维护性。

结束

通过以上方法,我们可以看到在 JavaScript 中进行复杂逻辑判断时,有许多方法可以让代码变得更简洁、更易维护。无论是使用对象还是 Map,都可以根据具体需求选择合适的方案。

希望这些技巧能帮助你在实际项目中写出更加优雅的代码。如果你觉得这篇文章对你有帮助,不妨点个赞并分享给更多的朋友吧!有任何疑问或建议,欢迎在评论区留言,我们一同讨论。

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

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

相关文章

重塑电商新风尚:优选免单策略的深度解析

在当今电商领域,一种创新的销售策略——优选免单模式正悄然兴起。这一模式巧妙融合了价格策略、激励机制与社交互动,旨在激发消费者的购买潜能,引领销售业绩的飞跃式增长。 一、合规创新,重塑激励机制 我们秉承合法合规的原则&am…

API-EXPLORER项目开发笔记(一)

文章目录 前言一、我为什么要做这个项目?二、项目简单介绍三、项目技术栈总结 前言 最近接触到了接口平台这个东西,非常感兴趣,于是就想自己也动手做一个具备核心功能的接口平台,本篇文章主要介绍了做这个项目的初衷以及简单介绍…

DispatcherServlet 源码分析

一.DispatcherServlet 源码分析 本文仅了解源码内容即可。 1.观察我们的服务启动⽇志: 当Tomcat启动之后, 有⼀个核⼼的类DispatcherServlet, 它来控制程序的执⾏顺序.所有请求都会先进到DispatcherServlet,执⾏doDispatch 调度⽅法. 如果有拦截器, 会先执⾏拦截器…

自动获取ip地址什么意思?电脑ip地址怎么设置自动获取

在当今数字化时代,网络连接已成为我们日常生活和工作中不可或缺的一部分。然而,对于非技术用户而言,复杂的网络配置常常令人望而生畏。幸运的是,自动获取IP地址(Dynamic Host Configuration Protocol, DHCP&#xff09…

小白入门机器学习被劝退的4大原因,你中了哪一个?

hi,喵老师🐱来啦。 很多小白朋友,尤其是准研究生、文科生,刚开始接触机器学习之后常常在短时间内就「入门即放弃」了。 其实背后主要的原因无非那么几个,今天喵老师就给大家盘一盘,看看你是哪一种&#x1…

SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景

前言 上一篇文章介绍了使用SemanticKernel/C#的RAG简易实践,在上篇文章中我使用的是兼容OpenAI格式的在线API,但实际上会有很多本地离线的场景。今天跟大家介绍一下在SemanticKernel/C#中如何使用Ollama中的对话模型与嵌入模型用于本地离线场景。 开始…

redis面试(七)初识lua加锁脚本

redisson redisson如何来进行redis分布式锁实现的源码&#xff0c;基于redis实现各种各样的分布式锁的原理 https://redisson.org/ 这是官网 https://github.com/redisson/redisson/wiki/Table-of-Content 这是官方文档 开始 demo 建一个普通的工程在pom.xml里引入依赖 <…

CFA CAIA最新道德手册第14版+道德案例手册(2024年最新原创写的内容,上一版还是10年前14年写的)

纯原创CFA CAIA最新道德手册第14版道德案例手册&#xff08;2024年最新原创写的内容&#xff0c;上一版还是10年前14年写的&#xff09; standards 是CFA三个级别和CAIA两个级别重中之重&#xff0c;2014年的版本太过老旧&#xff0c;现在协会发布了新考纲&#xff0c;自己原创…

LVS(Linux virual server)

目录 一.集群和分布式简介 1.系统性能扩展方式 2.集群Cluster 3.分布式 4.集群和分布式 二.lvs(Linux virtual server) 运行原理 1.lvs介绍 2.lvs集群体系结构 3.LVS概念 4.lvs集群的类型 nat模式 nat模式数据逻辑 lvs-nat模式原理及部署方法 实验环境部署 实验流程…

Proxy302:你的一站式代理IP解决方案

一、Proxy302介绍 Proxy302&#xff0c;一款优秀的全球代理IP平台&#xff0c;以按需充值的灵活方式、覆盖广泛的代理类型及直观高效的用户上手体验与界面设计&#xff0c;赢得了市场广泛认可。Proxy302亮点不仅在于其功能的强大&#xff0c;更在于其对用户体验的深刻理解和不…

代发考生战报:7月26号北京考试通过 HCIP-Cloud云计算 H13-527

代发考生战报&#xff1a;7月26号北京考试通过 HCIP-Cloud云计算 H13-527 &#xff0c;考试遇到4个新题&#xff0c;剩下都是题库里的&#xff0c;但是没打高分&#xff0c;可能题库里的答案有问题&#xff0c;但是能考过就行&#xff0c;挺满足的&#xff0c;就是把题库都背会…

IT知识库文档查找与学习:rfc文档

RFC文档查找 RFC&#xff08;Request for Comments&#xff09;文档是互联网工程任务组&#xff08;Internet Engineering Task Force, IETF&#xff09;发布的一系列备忘录&#xff0c;旨在提供互联网技术和应用的标准、规范、指南和最佳实践。RFC文档是互联网发展的基石&…

小怡分享之String类的小练习

前言&#xff1a; &#x1f308;✨之前小怡给大家分享了String类&#xff0c;今天小怡给大家分享String类的一些小习题。 1.第一个只出现一次的字符 思路&#xff1a; 遍历字符串&#xff0c;把对应字符位置的下标开始计数&#xff0c;count[字符-‘a’]&#xff1b;再次遍历…

数模——灰色关联分析算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、基本概念了解 1.什么是灰色系统&#xff1f; 2.什么是关联分析&#xff1f; 二、模型原理 三、建模过程 1.找母序列&#xff08;参考序列&am…

力扣面试150 逆波兰表达式求值 栈 模拟栈

Problem: 150. 逆波兰表达式求值 &#x1f468;‍&#x1f3eb; 参考题解 class Solution {//纯数组模拟栈实现(推荐) 3 ms 36 MBpublic static int evalRPN(String[] tokens) {int[] numStack new int[tokens.length / 2 1];int index 0;for (String s : tokens) {swit…

常见中间件漏洞(二、WebLogin合集)

目录 二、WebLogic Weblogic介绍 2.1 后台弱口令GetShell 漏洞描述 影响范围 环境搭建 漏洞复现 2.2 CVE-2017-3506 漏洞描述 影响版本 环境搭建 漏洞复现 2.3 CVE-2019-2725 漏洞描述 影响版本 环境搭建 漏洞复现 2.4 CVE-2018-2628 漏洞描述 漏洞影响 环…

STM32学习笔记2 --- GPIO输入

目录 AD/DA 按键 传感器模块 传感器模块细节 按键模块电路 传感器模块接入电路 OLED ​编辑 代码 封装驱动代码 GPIO读取函数 按键控制LED代码 部分解释 光敏传感器代码 部分解释 接线图 c知识补充 AD/DA AD&#xff1a;模拟-数字转换 DA&#xff1a;数字-模拟…

使用Idea进行Java开发断点打不进去

我在进行打断点时 出现了这个问题导致我无法进行断点测试 问题原因&#xff1a; 打的断点太多了 &#xff0c;导致线程冲突 解决办法 &#xff1a; 删除之前打完未去掉的断点 完美解决 Nice&#xff01; 有可能会不小心点到断点失效键&#xff0c;断点有可能会变成灰色 则为无…

【系统分析师】-综合知识-企业信息化与系统规划

1、一个有效的客户关系管理&#xff08; Customer Relationship Management,CRM&#xff09;解决方案应具备畅通有效的客户交流渠道、对所获信息进行有效分析和&#xff08;CRM 与 ERP 很好地集成&#xff09;等特点。 通过将&#xff08;人力资源、业务流程与专业技术&#x…

uniapp连接手机调试App,并最终打包成apk文件,和上传到应用商店的问题

对于一些刚开始使用uniapp开发app的同学来说&#xff0c;有时候仅仅是第一步连接手机进行开发测试都很难进行。这篇文章就来向大家介绍一些怎样连接手机进行调试我们开发中的项目&#xff0c;并最终将开发好的项目打成apk包进行安装&#xff0c;和将开发好的App应用上传到应用商…