js前端条件语句优化

2023-09-17 10:45:36

背景

在实际开发中,由于应用需求可能存在多种情况场景,那处理时就需要列举所有对应的情况去处理,常见的处理可能会用到if…else去处理。但是如果条件判断太多,就会导致代码过于冗余难以维护,因此我们可以使用其他的方式去优化、较少代码冗余量。
使用

1、借用Array的方法

1.1 多个判断用includes或者indexOf

举个例子🌰:

if(color==='yellow'||color==='red'||color==='purple'){
  ...
}

如果类似这种需要判断满足单一情况时,我们可以使用includes或者indexOf来代替|| 去列举其他的情况。
○ includes:判断数组中是否存在对应的枚举值,返回true或false
○ indexOf:判断数组中是否存在对应的枚举值,若存在返回对应元素的下标志,或者返回-1

const colorList=['yellow','red','purple',...]
//includes
if(colorList.includes(color)){
  ...
}
//indexOf
if(colorList.indexOf(color)!==-1){
  ...
}

1.2 所有或部分用every或some

举个例子:

// 1、是否所有情况都满足
const colors= [
    { name: 'color1', color: 'yellow' },
    { name: 'color2', color: 'red' },
    { name: 'color3', color: 'purple' }
];
  
function test(colors) {
    let isAllRed = true;
    for (let c of colors) {
        if (!isAllRed) break;
        isAllRed = (c.color == 'red');
    }
    return isAllRed;
}
//调用
test(colors);

//2、是否有满足的
const colors= [
    { name: 'color1', color: 'yellow' },
    { name: 'color2', color: 'red' },
    { name: 'color3', color: 'purple' }
];
  
function test(colors) {
    let isHasRed = false;
    for (let c of colors) {
        if (isHasRed) break;
        isHasRed = (c.color == 'red');
    }
    return isHasRed;
}
//调用
test(colors);

上面的例子中主要判断是否都满足或者满足一个就去处理,可以使用every来代替全满足情况,使用some来代替满足一种的情况,一行代码即可搞定~

// 1、是否所有情况都满足
const colors= [
    { name: 'color1', color: 'yellow' },
    { name: 'color2', color: 'red' },
    { name: 'color3', color: 'purple' }
];
  
function test(colors) {
   return colors.eveny((item)=>item?.color==='red')
}
//调用
test(colors);

//2、是否有满足的
const colors= [
    { name: 'color1', color: 'yellow' },
    { name: 'color2', color: 'red' },
    { name: 'color3', color: 'purple' }
];
  
function test(colors) {
  return colors.some((item)=>item?.color==='red')
}
//调用
test(colors);

2、对象或者map

2.1 简单判断

当业务代码需要实现类似以下这种情况时

function getColorDescribe(color) {
    if (color === "red") {
        console.log("红色");
    } else if (color === "yellow") {
        console.log("黄色");
    } else if (color === "green") {
        console.log("绿色");
    } else if (color === "purple") {
        console.log("紫色");
    } else if (color === "blue") {
        console.log("蓝色");
    } else {
        console.log("白色");
    }
}

这种代码逻辑上是完全符合需求的,但是如果情况有100+时,那么函数里面就会铺满if…else语句,代码的可读性和可维护都会大大降低。类似这种简单的判断,我们可以将以上的判断存储在一个对象或者map变量中
存储在对象的改造如下

const colorObj={
  red:()=>  console.log("红色"),
  yellow:()=>console.log("黄色"),
  green:()=> console.log("绿色"),
  purple:()=> console.log("紫色"),
  blue:()=>console.log("蓝色"),
}
function getColorDescribe(color){
  return colorObj[color]?.()|| console.log("白色");
}

这样将判读语句提出在外部,函数内部只注重判断结果的处理,浏览代码上更加具有可读性和简洁性
也可以使用使用map来实现相同的效果~

const colorObj=new Map([
  ['red',()=>  console.log("红色")],
  ['yellow',()=>console.log("黄色")],
  ['green',()=> console.log("绿色")],
  ['purple',()=> console.log("紫色")],
  ['blue',()=>console.log("蓝色")],
])
function getColorDescribe(color){
  return colorObj?.get(color)?.()|| console.log("白色");
}

2.2 复杂判断

实际开发时,判断条件不只是简单的相等判断,可能会出现需要满足类似以下复杂情况区域多重等的情况逻辑处理时

function getColorDescribe(color) {
    if (color.length>2) {
        console.log("颜色长度大于2");
    } else if (color === "yellow") {
        console.log("黄色");
    } else if (color?.[0]==='r') {
        console.log("颜色开头时r");
    } else if (color.includes('p')) {
        console.log("颜色包括p");
    } else if (color?.[1]==='y'&&color.length>4) {
        console.log("xxxxxx");
    } else {
        console.log("白色");
    }
}

以上的情况时,可以引进二维数组去优化

const colorObj = [
  [
    (color) => color.length > 2,
    () => console.log("颜色的长度大于2"),
  ],
  [
    (color) => color === "yellow",
    () => console.log("黄色"),
  ],
  [
    (color) => color?.[0] === "r",
    console.log("如果颜色以r开头"),
  ],
  [
    (color) => color.includes("p"),
    console.log("颜色包含p"),
  ],
  [
    (color) =>
      color?.[1] === "y" && color.length > 4,
    console.log("如果颜色以yy结尾且长度大于4"),
  ],
];

function getColorDescribe(color) {
  const getDescribe = colorObj.find((item) => item?.[0](color));
  return getDescribe? getDescribe[1]() : console.log("白色");
}

将判断都存储在二维数组的每一项中的第一项中,将对应的处理逻辑存储在第二项中。使用find去判断该二维数组中的第一项是否满足条件,并且返回。此时如果查找得到就去调用第二项函数处理,否则走默认兜底处理。
这样我们就可以将复杂的逻辑判断提取出来,函数内部尽最大化简化~

3、尽早return

举个例子:需要去判断颜色是否有传,有传时需要判断内部的权重,给出的处理代码如下

function test(color, quantity) {
  const colorList = ['red', 'yellow', 'blue', 'cyan'];

  if (color) {
    if (colorList.includes(color)) {
      console.log('存在');
      if (quantity > 10) {
        console.log('big quantity');
      }
    }
  } else {
  console.log('No Color!');
  }
}

内部需要对有满足的值才去处理,可以使用不满足时就return的方法去改造

function test(color, quantity) {
  const colorList = ['red', 'yellow', 'blue', 'cyan'];
  if(!color) return console.log('No Color!'); // 如果没有传入颜色参数,则返回提示信息
  if(!colorList.includes(color)) return; // 如果传入的颜色参数不在颜色列表中,则返回
  console.log('存在'); // 输出存在的信息
  if (quantity > 10) { // 如果数量大于10
    console.log('big quantity'); // 输出大数量的信息
  }
}

以上逻辑,在没有颜色时就return,没有包括对应的颜色时也return的处理,这种处理可以大大减少内部嵌套。

4、借用运算符

4.1 三元运算符

举个例子

if(color==='red'){
  console.log('红色')
}else{
  console.log('不是红色')
}

当我们的if…else语句中各有一个表达式情况时,我们就可以使用三元运算符去替换
color===‘red’? console.log(‘红色’): console.log(‘不是红色’)
使用三元运算符一行代码即可实现,但是,不推荐多层的三元运算符,会加大阅读性负担。

4.2 ??、||、&&

单个判断时并且只有一个表达式时,可以使用??、||、&&运算符去对应情况处理。例如当color变量没有值时使用??替换if,或者没有值或者是0、false时使用||替换,或者是满足某种情况时使用&&替换。

//1.??
if([null,undefined].includes(color)){
  console.log('有值')
}
//替换
color??console.log('有值')

//2.||
if(!color){
  console.log('有值')
}
//替换
color||console.log('有值')

//3.&&
if(color.length>2){
  console.log('有值')
}
//替换
color.length>2&&console.log('有值')

更多推荐

在IOS 的开发中iBeacon和BLE的区别

区分3个概念beacon、BLE、iBeaconBLE全称为BluetoothLowEnergy,蓝牙低功耗技术。现在的蓝牙技术所消耗的功耗很低,并不像传闻中不使用蓝牙需要关闭省电,手机上长期打开蓝牙所消耗的电量可以忽略不计。beacon是用于室内定位,基于BLE协议的在广播搜索上稍作变化变更了数据类型实现的一个应用场

智能井盖:提升城市井盖安全管理效率

窨井盖作为城市基础设施的重要组成部分,其安全管理与城市的有序运行和群众的生产生活安全息息相关,体现城市管理和社会治理水平。当前,一些城市已经将智能化的窨井盖升级改造作为新城建的重要内容,推动窨井盖等“城市部件”配套建设物联智能感知设备,促进现代信息技术与城市生命线深度融合,提升窨井盖安全管理效率和水平。智能井盖通过再井

Java集合--Collection、Map、List、Set、Iterator、Collections工具类

文章目录一、Java集合框架概述二、Collection接口方法2.1、Collection子接口一:List2.1.1、ArrayLIst的源码分析2.1.2、LinkedList的源码分析2.1.3、List接口中的常用方法2.2、Collection子接口二:Set2.2.1、Set接口的无序性2.2.2、添加元

设计模式:模板方法模式

目录组件代码示例源码中使用优缺点总结模板方法模式(TemplateMethodPattern)是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤的具体实现延迟到子类中。模板方法模式通过将共同的行为放在父类中,而将具体的实现交给子类来完成,从而实现了代码的复用和扩展。在模板方法模式中,父类定义了一个模板方法,该方法

【Java 基础篇】深入理解Java集合嵌套:构建和管理复杂数据结构的终极指南

当我们谈论集合嵌套时,我们指的是在一个集合中存储另一个集合,或者说集合中的元素本身也是集合。这是一个非常有用的概念,可以在处理复杂数据结构时提供更灵活的选项。在本文中,我们将深入探讨Java中集合嵌套的概念、用法以及一些最佳实践。什么是集合嵌套?集合嵌套是指将一个集合类型的对象存储在另一个集合中。在Java中,我们通常

mybatis学习记录(四)-----MyBatis核心配置文件详解

目录MyBatis核心配置文件详解4.1environment4.2transactionManager4.3dataSource4.4properties4.5mapperMyBatis核心配置文件详解mybatis-config.xml:<?xmlversion="1.0"encoding="UTF-8"?><!D

Word 文档转换 PDF、图片

工作有需要Word文档转换PDF、图片的场景,我们来看看Java开发中怎么解决这个问题的。Word转PDFWord转PDF分为商用Aspose方案和开源ApachePOI+iText方案。Aspose方案这种方式在目前来看应该是最好的,无论是转换的速度还是成功的概率,还支持的文件类型。由于Aspose并非开源软件,不会

ArcGIS 10.3软件安装包下载及安装教程!

【软件名称】:ArcGIS10.3【安装环境】:Windows【下载链接】:链接:https://pan.baidu.com/s/1K5ab7IHMYa23HpmuPkFa1A提取码:oxbb复制这段内容后打开百度网盘手机App,操作更方便哦软件解压码点击原文获取:ArcGIS10.3软件安装包下载及安装教程软件介绍:

理解MySQL的会话变量、局部变量和全局变量

理解MySQL的会话变量、局部变量和全局变量1.MySQL变量分类根据作用范围不同,分为会话用户变量和局部变量。会话用户变量:作用域和会话变量一样,只对当前连接会话有效。局部变量:只在BEGIN和END语句块中有效,局部变量只能在存储过程和存储函数中使用。全局变量:在MySQL服务器启动运行后,系统内置变量。2.变量定

QRunnable与外界互传对象

1.概述QRunnable与外界互通讯是有两种方法的使用多继承。让我们的自定义线程类同时继承于QRunnable和QObject,这样就可以使用信号和槽,但是多线程使用比较麻烦,特别是继承于自定义的类时,容易出现接口混乱,所以在项目中尽量少用多继承。//使用多继承classrunnable:publicQObject,

xdebug3开启profile和trace

【xdebug开启profiler】https://xdebug.org/docs/profilerhttp://www.xdebug.org.cn/docs/profiler1、php.ini添加下面配置然后重启php容器:xdebug.mode=profile;这个目录保存profile和trace文件xdebug

热文推荐