2016-08-18 11 views
0

私は機能する関数を持っていますが、もっと良い方法があるのだろうかと思っています。フォールバックセレクタの書き方を改善しましたか?

私は5つのサイズがあり、現在のサイズのズームレベルを取得しようとしています。現在のサイズにサイズが指定されていない場合は、キャッチがあります。使用する指定があるかどうかを確認するために、他の小さいサイズをチェックします。現在、私はの束と大きなswitchを持って指定されていませんXLズームが存在しない場合は、チェック等、LGは使用しない場合は、MDのサイズがあるかどうかを確認することがあるある

if/else声明。私が行方不明になっているこれを行うためのクリーナーの方法?

self.updateZoom = function() { 
    var defaultZoomLevel = 8; 

    switch(self.getSize()) { 
    case 'xs': 
    if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    case 'sm': 
    if (self.smZoom) { 
     self.zoom = self.smZoom; 
    } else if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    case 'md': 
    if (self.mdZoom) { 
     self.zoom = self.mdZoom; 
    } else if (self.smZoom) { 
     self.zoom = self.smZoom; 
    } else if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    case 'lg': 
    if (self.lgZoom) { 
     self.zoom = self.lgZoom; 
    } else if (self.mdZoom) { 
     self.zoom = self.mdZoom; 
    } else if (self.smZoom) { 
     self.zoom = self.smZoom; 
    } else if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    case 'xl': 
    if (self.xlZoom) { 
     self.zoom = self.xlZoom; 
    } else if (self.lgZoom) { 
     self.zoom = self.lgZoom; 
    } else if (self.mdZoom) { 
     self.zoom = self.mdZoom; 
    } else if (self.smZoom) { 
     self.zoom = self.smZoom; 
    } else if (self.xsZoom) { 
     self.zoom = self.xsZoom; 
    } else { 
     self.zoom = defaultZoomLevel; 
    } 
    break; 
    default: 
    self.zoom = defaultZoomLevel; 
    } 

    self.zoom = parseInt(self.zoom); 
} 
+0

スイッチの代わりに、ケースxlだけを使用できます。私が見る限り、これはスイッチの場合と同じズームレベルになります。 –

+0

'self.zoom = self.xsZoom || defaultZoomLevel; ' – dandavis

答えて

1

さんは「プログレッシブ・エンハンスメント」と呼んでみましょう:

我々は最小で開始し、我々はself.getSize()

['xs', 'sm', 'md', 'lg', 'xl'].forEach(function(size){ 
    if(self[size + 'Zoom']){ 
     self.zoom = self[size + 'Zoom']; 
    } 

    if(size == self.getSize()){ 
     return false; 
    } 
}); 

EDITによって返されたサイズに達するまで進行:内部分割する方法がないようあなたはES6の方法で試すことができます:

['xs', 'sm', 'md', 'lg', 'xl'].some(function(size){ 
    if(self[size + 'Zoom']){ 
     self.zoom = self[size + 'Zoom']; 
    } 

    return size == self.getSize(); 
}); 

または@グルーフーズ純粋なJSと@pwolaqのバージョンの周り

+1

なぜあなたはfalseを返しますか? –

+0

return falseは、jQuery for-each-loopで "break"を意味します – Marcus

+0

trueを返すとブレークしません。 –

1

他の方法に答える:'lg'ある

// init variables 
var steps = ['xl', 'lg', 'md', 'sm', 'xs']; 
var i = steps.indexOf(self.getSize()); 

// check borders 
i = (i == -1) ? steps.length-1 : i; 
// set default zoom 
self.zoom = self.xsZoom; 

// "search" best zoom 
for(; i<steps.length; i++){ 
    if(self[steps[i] + 'Zoom']){ 
    self.zoom = self[steps[i]+'Zoom']; 
    break; 
    } 
} 

self.getSize()場合、それは最初self.lgZoomをしようとします。成功しない場合はself.mdZoom、次にself.smZoomなどと試してみます。

+0

どうすればindexOf -1を返しますか? – pwolaq

+0

あなたの権利を修正しました – Marcus

+0

条件ループに入る前に - すべての反復でチェックされますが、zoomZをdefaultZoomLevelに設定しないことは言及しません。変数値 – pwolaq

関連する問題