JS優(yōu)雅寫法 - 用遍歷代替if/else

前言

最近利用改完 bug 的空閑期七婴,優(yōu)化了一下比較不優(yōu)雅的代碼。
這里分享一種用遍歷代替if else的寫法察滑。

需求

調(diào)用接口返回一個(gè) code, 前端需要根據(jù)不同的 code 設(shè)置不同的圖標(biāo)打厘。多個(gè) code 可能使用同一個(gè)圖標(biāo)。

改造前

改造前的代碼邏輯比較平鋪直敘贺辰,用了大量的if...else語句户盯。
首先,這種方法是完全 OK 的(工作上饲化,以能夠?qū)崿F(xiàn)業(yè)務(wù)為第一目標(biāo)莽鸭。)
但是在寫法上呢,篇幅又長又臭吃靠。

const changeWeatherCode = (code) => {
  if ((code > 0 && code <= 2) ||  code == 5 || code == 30 || (code > 32 && code <= 34)) {
    return 'SUNNY';
  } else if ((code > 2 && code <= 4) || (code > 5 && code <= 6) || (code > 34 && code <= 36)) {
    return 'CLOUDY';
  } else if ((code > 6 && code <= 8) || code == 31 || (code > 36 && code <= 38)) {
    return 'DREARY';
  } else if (code == 11) {
    return 'FOG';
  } else if ((code > 11 && code <= 14) || (code > 38 && code <= 40)) {
    return 'SHOWERS';
  } else if ((code > 14 && code <= 17) || (code > 40 && code <= 42)) {
    return 'T_STORMS';
  } else if (code == 18) {
    return 'RAIN';
  } else if ((code > 18 && code <= 24) || (code > 42 && code <= 44)) {
    return 'SNOW';
  } else if (code > 24 && code <= 29) {
    return 'RAIN_SNOW';
  } else if (code == 32) {
    return 'WIND';
  }
}

(而且硫眨,每個(gè)if里面都有返回值,就不需要再else了巢块,直接下一個(gè)if即可)

改造思路

這些 code 是從 0~44礁阁,并分為 10 大類巧号。
是不是可以用對象形式儲(chǔ)存,更為直觀呢姥闭?

const codeToName = {
  SUNNY: [1, 2, 5, 30, 33, 34],
  CLOUDY: [3, 4, 6, 35, 36],
  DREARY: [7, 8, 31, 37, 38],
  T_STORMS: [15, 16, 17, 41, 42],
  SHOWERS: [12, 13, 14, 39, 40],
  SNOW: [19, 20, 21, 22, 23, 24, 43, 44],
  RAIN_SNOW: [25, 26, 27, 28, 29],
  RAIN: [18],
  WIND: [32],
  FOG: [11]
};

這里的改寫各位千萬別自己手動(dòng)寫進(jìn)去丹鸿,費(fèi)時(shí)費(fèi)力又容易出錯(cuò)。
可以利用原來的代碼棚品,用 for 循環(huán) 44 次+push 的方法直接生成一個(gè)這樣的對象靠欢。
接下來,我們就要開始遍歷了铜跑。通過傳進(jìn)來的 code门怪,來找到對應(yīng)的鍵名。

改造后

遍歷的方法有很多種疼进,for循環(huán)薪缆、filterfind伞广、findIndexindexOf疼电、includes等等都是可以用的嚼锄,但是注意返回的值是不同的。

for
const changeWeatherCode = (code) => {
  for (let i in codeToName) {
    for (const j of codeToName[i]) {
       if (j === code) return i
    }
  }
}
filter
const changeWeatherCode = (code) => {
  for (let i in codeToName) {
    const result = codeToName[i].filter(item => item === code)
    if (result.length) return i // filter會(huì)返回一個(gè)數(shù)組蔽豺,沒有找到則返回空數(shù)組
  }
}
find
const changeWeatherCode = (code) => {
  for (let i in codeToName) {
    const result = codeToName[i].find(item => item === code)
    if (result) return i // find返回鍵值区丑,沒有找到則返回undefined
  }
}
findIndex
const changeWeatherCode = (code) => {
  for (let i in codeToName) {
    const result = codeToName[i].find(item => item === code)
    if (result !== -1) return i // findIndex返回索引值,沒有找到則返回-1
  }
}
補(bǔ)充indexOf和includes

大神說用indexOf和includes更方便修陡,這里也記錄一下沧侥。

const changeWeatherCode = (code) => {
  for (let i in codeToName) {
    // if (codeToName[i].indexOf(code) > -1) return i   或者
    if (codeToName[i].includes(code)) return i
  }
}

總結(jié)

這幾種寫法都大同小異,只需要注意返回值即可魄鸦。
相比起原先大白話的寫法宴杀,后者把代碼抽象化,簡潔明了拾因,也更加優(yōu)雅旺罢。
另外,如果返回的code具有規(guī)律的話绢记,也可以用正則來判斷區(qū)間扁达。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蠢熄,隨后出現(xiàn)的幾起案子跪解,更是在濱河造成了極大的恐慌,老刑警劉巖签孔,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叉讥,死亡現(xiàn)場離奇詭異砾跃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)节吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門抽高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人透绩,你說我怎么就攤上這事翘骂。” “怎么了帚豪?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵碳竟,是天一觀的道長。 經(jīng)常有香客問我狸臣,道長莹桅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任烛亦,我火速辦了婚禮诈泼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煤禽。我一直安慰自己铐达,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布檬果。 她就那樣靜靜地躺著瓮孙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪选脊。 梳的紋絲不亂的頭發(fā)上杭抠,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音恳啥,去河邊找鬼偏灿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛角寸,可吹牛的內(nèi)容都是我干的菩混。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼扁藕,長吁一口氣:“原來是場噩夢啊……” “哼沮峡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亿柑,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤邢疙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疟游,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呼畸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颁虐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛮原。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖另绩,靈堂內(nèi)的尸體忽然破棺而出儒陨,到底是詐尸還是另有隱情,我是刑警寧澤笋籽,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布蹦漠,位于F島的核電站,受9級特大地震影響车海,放射性物質(zhì)發(fā)生泄漏笛园。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一侍芝、第九天 我趴在偏房一處隱蔽的房頂上張望研铆。 院中可真熱鬧,春花似錦竭贩、人聲如沸蚜印。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哟冬,卻和暖如春楼熄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浩峡。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工可岂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翰灾。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓缕粹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纸淮。 傳聞我的和親對象是個(gè)殘疾皇子平斩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容