国产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黄一级视频 | 人人干人人爽 | 国产亚洲三级 | 图片专区亚洲欧美另类 | 在线观看亚洲视频 | 免费看操片| 国产精选在线 | 九九热精品在线观看 | 久久国产免费一区 | 香蕉午夜视频 | 欧美 日韩 国产在线 | 国产黄色在线看 | 免费一看一级毛片全播放 | 日韩在线欧美在线 | 亚洲国产精品嫩草影院久久 | 国产精品视频大全 | 在线观看免费国产 | 一区二区免费播放 | 欧美精品色精品一区二区三区 | 在线观看网站国产 | 国产h视频在线观看 | 国内偷自第一二三区 | 思久久| 国产成人青青热久免费精品 | 欧美另类色图 | 日韩精品成人 | 国产欧美日韩亚洲 | 国产精品亚洲欧美一区麻豆 |