国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

js中如何取代if-else和switch

來源:懂視網 責編:小采 時間:2020-11-27 19:33:33
文檔

js中如何取代if-else和switch

js中如何取代if-else和switch:這篇文章主要介紹了關于js中如何取代if-else和switch,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下1.前言相信很多人有這樣的經歷,在項目比較忙的時候,都是先考慮實現,用當時以為最好的方式先實現方案,在項目不忙的時候,再看下以前代
推薦度:
導讀js中如何取代if-else和switch:這篇文章主要介紹了關于js中如何取代if-else和switch,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下1.前言相信很多人有這樣的經歷,在項目比較忙的時候,都是先考慮實現,用當時以為最好的方式先實現方案,在項目不忙的時候,再看下以前代

如果還想靈活一些,可以封裝一個稍微通用一點的look-up函數。

function showGrace(grace,level,levelForGrace) {
 for(let i=0;i<level.length;i++){
 if(grace>=level[i]){
 return levelForGrace[i];
 }
 }
 //如果不存在,那么就是分數很低,返回最后一個
 return levelForGrace[levelText.length-1];
}
let graceForLevel=[700,650,600,550];
let levelText=['信用極好','信用優秀','信用良好','信用中等','信用較差'];

4232849946-5b4b734d915f2_articlex[1].jpg

使用推薦配置數據和業務邏輯分離形式開發,還有一個好處,在上面例子沒體現出來,下面簡單說下。比如輸入一個景點,給出景點所在的城市。

function getCityForScenic(scenic) {
 let _city=''
 if(scenic==='廣州塔'){
 _city='廣州'
 }
 else if(scenic==='西湖'){
 _city='杭州'
 }
 return _city;
}

輸入廣州塔,就返回廣州。輸入西湖就返回杭州。但是一個城市不止一個景點,那么有人習慣這樣寫。

if(scenic==='廣州塔'||scenic==='花城廣場'||scenic==='白云山'){
 _city='廣州'
}

如果景點很多,數據很長,看著難受,有些人喜歡這樣寫

let scenicOfHangZhou=['西湖','湘湖','砂之船生活廣場','京杭大運河','南宋御街']
if(~scenicOfHangZhou.indexOf(scenic)){
 _city='杭州'
}

3241828791-5b4b735e6f200_articlex[1].jpg

這樣執行沒錯,但是寫出來的代碼可能像下面這樣,風格不統一。

function getCityForScenic(scenic) {
 let _city='';
 let scenicOfHangZhou=['西湖','湘湖','砂之船生活廣場','京杭大運河','南宋御街'];
 if(scenic==='廣州塔'||scenic==='花城廣場'||scenic==='白云山'){
 _city='廣州'
 }
 else if(~scenicOfHangZhou.indexOf(scenic)){
 _city='杭州'
 }
 return _city;
}

即使用switch,也有可能出現這樣的情況

function getCityForScenic(scenic) {
 let _city='';
 let scenicOfHangZhou=['西湖','湘湖','砂之船生活廣場','京杭大運河','南宋御街'];
 switch(true){
 case (scenic==='廣州塔'||scenic==='花城廣場'||scenic==='白云山'):_city='廣州';break;
 case (!!~scenicOfHangZhou.indexOf(scenic)):return '杭州'; 
 }
 return _city;
}

雖然上面的代碼出現的概率很小,但畢竟會出現。這樣的代碼可能會造成日后維看得眼花繚亂。如果使用了配置數據和業務邏輯分離,那就可以避免這個問題。

function getCityForScenic(scenic) {
 let cityConfig={
 '廣州塔':'廣州',
 '花城廣場':'廣州',
 '白云山':'廣州',
 '西湖':'杭州',
 '湘湖':'杭州',
 '京杭大運河':'杭州',
 '砂之船生活廣場':'杭州',
 '南宋御街':'杭州',
 }
 
 return cityConfig[scenic];
}
有些人不習慣對象的 key 名是中文。也可以靈活處理
function getCityForScenic(scenic) {
 let cityConfig=[
 {
 scenic:'廣州塔',
 city:'廣州'
 },
 {
 scenic:'花城廣場',
 city:'廣州'
 },
 {
 scenic:'白云山',
 city:'廣州'
 },
 {
 scenic:'西湖',
 city:'杭州'
 },
 {
 scenic:'湘湖',
 city:'杭州'
 },
 {
 scenic:'京杭大運河',
 city:'杭州'
 },
 {
 scenic:'砂之船生活廣場',
 city:'杭州'
 }
 ]
 for(let i=0;i<cityConfig.length;i++){
 if(cityConfig[i].scenic===scenic){
 return cityConfig[i].city
 }
 }
}

這樣一來,如果以后要加什么景點,對應什么城市,只能修改上面的cityConfig,業務邏輯不需要改,也不能改。代碼風格上面就做到了統一。

這里簡單總結下,使用配置數據和業務邏輯分離的形式,好處

  1. 修改配置數據比業務邏輯修改成本更小,風險更低

  2. 配置數據來源和修改都可以很靈活

  3. 配置和業務邏輯分離,可以更快的找到需要修改的代碼

  4. 配置數據和業務邏輯可以讓代碼風格統一

但是并不是所有的if-else都建議這樣改造,有些需求不建議使用look-up改造。比如if-else不是很多,if判斷的邏輯不統一的使用,還是建議使用if-else方式實現。但是神仙數字,要清除。

比如下面這個根絕傳入時間戳,顯示評論時間顯示的需求,

發布1小時以內的評論:x分鐘前

發布1小時~24小時的評論:x小時前

發布24小時~30天的評論:x天前

發布30天以上的評論:月/日

去年發布并且超過30天的評論:年/月/日

實現不難,幾個if-else就行了

function formatDate(timeStr){
 //獲取當前時間戳
 let _now=+new Date();
 //求與當前的時間差
 let se=_now-timeStr;
 let _text='';
 //去年
 if(new Date(timeStr).getFullYear()!==new Date().getFullYear()&&se>2592000000){
 _text=new Date(timeStr).getFullYear()+'年'+(new Date(timeStr).getMonth()+1)+'月'+new Date(timeStr).getDate()+'日';
 }
 //30天以上
 else if(se>2592000000){
 _text=(new Date(timeStr).getMonth()+1)+'月'+new Date(timeStr).getDate()+'日';
 }
 //一天以上
 else if(se>86400000){
 _text=Math.floor(se/86400000)+'天前';
 }
 //一個小時以上
 else if(se>3600000){
 _text=Math.floor(se/3600000)+'小時前';
 }
 //一個小時以內
 else{
 //如果小于1分鐘,就顯示1分鐘前
 if(se<60000){se=60000}
 _text=Math.floor(se/60000)+'分鐘前';
 }
 return _text;
}

89164637-5b4b73766d26b_articlex[1].jpg

運行結果沒問題,但是也存在一個問題,就是這個需求有神仙數字:2592000000,86400000,3600000,60000。對于后面維護而言,一開始可能并不知道這個數字是什么東西。

所以下面就消滅神仙數字,常量化

function formatDate(timeStr){
 //獲取當前時間戳
 let _now=+new Date();
 //求與當前的時間差
 let se=_now-timeStr;
 const DATE_LEVEL={
 month:2592000000,
 day:86400000,
 hour:3600000,
 minter:60000,
 }
 let _text='';
 //去年
 if(new Date(timeStr).getFullYear()!==new Date().getFullYear()&&se>DATE_LEVEL.month){
 _text=new Date(timeStr).getFullYear()+'年'+(new Date(timeStr).getMonth()+1)+'月'+new Date(timeStr).getDate()+'日';
 }
 //一個月以上
 else if(se>DATE_LEVEL.month){
 _text=(new Date(timeStr).getMonth()+1)+'月'+new Date(timeStr).getDate()+'日';
 }
 //一天以上
 else if(se>DATE_LEVEL.day){
 _text=Math.floor(se/DATE_LEVEL.day)+'天前';
 }
 //一個小時以上
 else if(se>DATE_LEVEL.hour){
 _text=Math.floor(se/DATE_LEVEL.hour)+'小時前';
 }
 //一個小時以內
 else{
 //如果小于1分鐘,就顯示1分鐘前
 if(se<DATE_LEVEL.minter){se=DATE_LEVEL.minter}
 _text=Math.floor(se/DATE_LEVEL.minter)+'分鐘前';
 }
 return _text;
}

運行結果也是正確的,代碼多了,但是神仙數字沒了。可讀性也不差。

這里也順便提一下,如果硬要把上面的需求改成look-up的方式,代碼就是下面這樣。這樣代碼的修改的擴展性會強一些,成本會小一些,但是可讀性不如上面。取舍關系,實際情況,實際分析。
function formatDate(timeStr){
 //獲取當前時間戳
 let _now=+new Date();
 //求與當前的時間差
 let se=_now-timeStr;
 let _text='';
 //求上一年最后一秒的時間戳
 let lastYearTime=new Date(new Date().getFullYear()+'-01-01 00:00:00')-1;
 //把時間差添加進去(當前時間戳與上一年最后一秒的時間戳的差)添加進去,如果時間差(se)超過這個值,則代表了這個時間是上一年的時間。
 //DATE_LEVEL.unshift(_now-lastYearTime);
 const DATE_LEVEL={
 month:2592000000,
 day:86400000,
 hour:3600000,
 minter:60000,
 }
 let handleFn=[
 {
 time:DATE_LEVEL.month,
 fn:function(timeStr){
 return (new Date(timeStr).getMonth()+1)+'月'+new Date(timeStr).getDate()+'日';
 }
 },
 {
 time:DATE_LEVEL.day,
 fn:function(timeStr){
 return Math.floor(se/DATE_LEVEL.day)+'天前';
 }
 },
 {
 time:DATE_LEVEL.hour,
 fn:function(timeStr){
 return Math.floor(se/DATE_LEVEL.hour)+'小時前';
 }
 },
 {
 time:DATE_LEVEL.minter,
 fn:function(timeStr){
 return Math.ceil(se/DATE_LEVEL.minter)+'分鐘前';
 }
 } 
 ];
 //求上一年最后一秒的時間戳
 let lastYearTime=new Date(new Date().getFullYear()+'-01-01 00:00:00')-1;
 //把時間差(當前時間戳與上一年最后一秒的時間戳的差)和操作函數添加進去,如果時間差(se)超過這個值,則代表了這個時間是上一年的時間。
 handleFn.unshift({
 time:_now-lastYearTime,
 fn:function(timeStr){
 if(se>DATE_LEVEL.month){
 return new Date(timeStr).getFullYear()+'年'+(new Date(timeStr).getMonth()+1)+'月'+new Date(timeStr).getDate()+'日';
 
 }
 },
 });
 let result='';
 for(let i=0;i<handleFn.length;i++){
 if(se>=handleFn[i].time){
 result=handleFn[i].fn(timeStr);
 if(result){
 return result;
 }
 }
 }
 //如果發布時間小于1分鐘,之際返回1分鐘
 return result='1分鐘前'
}

3.配置對象代替switch

比如有一個需求:傳入cash,check,draft,zfb,wx_pay,對應輸出:現金,支票,匯票,支付寶,微信支付。

需求也很簡單,就一個switch就搞定了

function getPayChanne(tag){
 switch(tag){
 case 'cash':return '現金';
 case 'check':return '支票';
 case 'draft':return '匯票';
 case 'zfb':return '支付寶';
 case 'wx_pay':return '微信支付';
 }
}

1497476940-5b4b738a9919c_articlex[1].jpg

但是這個的硬傷還是和上面一樣,萬一下次又要多加一個如:bank_trans對應輸出銀行轉賬呢,代碼又要改。類似的問題,同樣的解決方案,配置數據和業務邏輯分離。代碼如下。

function getPayChanne(tag){
 let payChanneForChinese = {
 'cash': '現金',
 'check': '支票',
 'draft': '匯票',
 'zfb': '支付寶',
 'wx_pay': '微信支付',
 };
 return payChanneForChinese[tag];
}

同理,如果想封裝一個通用的,也可以的

let payChanneForChinese = {
 'cash': '現金',
 'check': '支票',
 'draft': '匯票',
 'zfb': '支付寶',
 'wx_pay': '微信支付',
};
function getPayChanne(tag,chineseConfig){
 return chineseConfig[tag];
}
getPayChanne('cash',payChanneForChinese);

這里使用對象代替 switch 好處就在于

  1. 使用對象不需要 switch 逐個 case 遍歷判斷。

  2. 使用對象,編寫業務邏輯可能更靈活

  3. 使用對象可以使得配置數據和業務邏輯分離。好處參考上一部分內容。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

js中如何取代if-else和switch

js中如何取代if-else和switch:這篇文章主要介紹了關于js中如何取代if-else和switch,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下1.前言相信很多人有這樣的經歷,在項目比較忙的時候,都是先考慮實現,用當時以為最好的方式先實現方案,在項目不忙的時候,再看下以前代
推薦度:
標簽: switch js sw
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 福利视频一区二区三区 | 亚洲欧洲另类 | 欧美精品国产综合久久 | 熟年交尾五十路视频在线播放 | 欧美成人福利 | 欧美成人精品高清在线播放 | 一级毛片免费毛片毛片 | 国产美女视频黄a视频全免费网站 | 午夜日本一区二区三区 | 欧美国产一区二区三区 | 日本一区二区三区在线播放 | 国产亚洲一区二区精品 | 国产一区二区在线看 | 亚洲一区三区 | 国产精品久久久久国产精品 | 国产精品视频免费看 | 欧美亚洲综合另类 | 国产成人高清一区二区私人 | 视频二区 素人 欧美 日韩 | 亚洲日本一区二区三区高清在线 | 欧美激情视频一区二区三区 | 欧美视频免费在线观看 | 欧美网站在线看 | 日本国产最新一区二区三区 | 亚洲精品乱码久久久久 | 精品国产综合成人亚洲区 | 国产毛片久久久久久国产毛片 | 亚洲国产成人精品久久 | 亚洲国产视频网站 | 国产成人综合久久 | 日韩欧美色视频 | 欧美成人中文字幕在线视频 | 亚洲综合图片小说区热久久 | 日韩欧美国产精品第一页不卡 | 欧美日韩极品 | 亚洲福利网站 | 日韩亚洲国产综合久久久 | 久热中文字幕在线精品首页 | 欧美成人一级视频 | 在线观看国产亚洲 | 久久久久久国产a免费观看黄色大片 |