多条件if...else...选择语句代码优化

偶尔间又看到了自己的博客,突然发现好久没有写博客了。看到自己的博客现在浏览量还算挺不错的,所以决定重新开始写一些博客,不过我已经转行前端两年了,所以不会像以前那样写C++和算法了,现在以写前端的内容为主。

最近在写业务代码时,发现有一段业务的逻辑非常蛋疼,由于选择逻辑太多,所以需要靠多个if...else...来实现。大致的代码如下:

function getQueryType(item) {
    if (item.match(/(sampleHash)|(apkMd5)/g)) {
      return 'sample_hash'
    } else if (item.match(/(programName)|(appName)/g)) {
      return 'program_name'
    } else if (item.match(/imei/g)) {
      return 'imei'
    } else if (item.match(/(packageName)|(apkName)|(apppackageName)/g)) {
      return 'package_name'
    } else if (item.match(/(sensitiveStringsEmail)|(developerEmail)/g)) {
      return 'sensitive_strings_email'
    } else if (item.match(/keyhash/g)) {
      return 'cert_list_keyhash'
    } else if (item.match(/sensitiveStringsDomain/g)) {
      return 'sensitive_strings_domain'
    } else if (item.match(/sensitiveStringsIp/g)) {
      return 'sensitive_strings_ip'
    } else if (item.match(/sensitiveStringsSp/g)) {
      return 'sensitive_strings_sp'
    } else if (item.match(/id/g)) {
      return 'id'
    }
    return null
  }
其实这段代码刚开始只有两到三个分支,后来由于需求变更,一下子增加了多个分支,当我基于原来的代码模式写完这段逻辑的时候自己都看吐了,所以立马想办法优化。

具体思路历程如下:碰到if...else...代码的优化问题,一般首先会想到用switch..case来代替,但是,这里由于业务的原因,这段代码换成switch...case会变得相当麻烦,而且也治标不治本,代码还是不好看。所以,当选择的分支太多时,可以借助数组来做一个映射,只需要遍历这个数组即可,这样不仅让代码更加简洁美观,也更方便后续的维护。

优化后的代码如下:

//定义映射数组
const MAP = [
  { ret: 'sample_hash', match: ['sampleHash', 'apkMd5'] },
  { ret: 'program_name', match: ['programName', 'appName'] },
  { ret: 'imei', match: ['imei'] },
  { ret: 'package_name', match: ['packageName', 'apkName', 'apppackageName'] },
  { ret: 'sensitive_strings_email', match: ['sensitiveStringsEmail', 'developerEmail'] },
  { ret: 'cert_list_keyhash', match: ['keyhash'] },
  { ret: 'sensitive_strings_domain', match: ['sensitiveStringsDomain'] },
  { ret: 'sensitive_strings_ip', match: ['sensitiveStringsIp'] },
  { ret: 'sensitive_strings_sp', match: ['sensitiveStringsSp'] },
  { ret: 'id', match: ['id'] }
]

function getQueryType(item) {
  const r = MAP.find(m => m.match.some(s => item.indexOf(s) > -1))
  if (!r) {
    return null
  }
  return r.ret
}
对比一下上面两端代码,是不是会发现下面的代码明显漂亮很多,而且还方便维护,如果有新的类型加入,直接添加在MAP数组里面就行了!

这里只是为大家提供一个写代码的思路,如果在写代码过程中发现有些地方选择条件太多,或者很多特殊数据需要处理的时候,不妨借助数组来做个映射,这样就很方便解决问题。

你可能感兴趣的:(前端技术)