2016-08-03 55 views
0

我的目標是以更適當的形式重構下面的條件。用更好的東西代替這些條件會很好。如果重構witth包含邏輯

該邏輯的主要思想是這些「ifs」的順序不應該改變。即,如果數組中至少存在一個「j」值,即使存在其他值,也應該返回該值。

var items = [j,a]; 
if(_.contains(items, "j")) { 
    return "j"; 
} else if(_.contains(items, "a")) { 
    return "a"; 
} else if(_.contains(items, "l")) { 
    return "l"; 
} 
return "d"; 

任何想法將不勝感激。

+1

這可能適合更好在http://codereview.stackexchange.com/ – deltree

回答

2

這是您尋找的「更好的東西」嗎? (注意字母的順序向後,這樣,如果j包含將信件退回...)

var items = [j,a]; 
var matchItems = ["l", "a", "j"]; 
var letter = "d"; //default 

_.each(matchItems, function(item) { 
    if(_.contains(items, item)) letter = item; 
}) 

return letter 

更新:如果你想保持斷裂狀態

使用
var items = [j,a]; 
var matchItems = ["j", "a", "l"]; 
var letter = "d"; //default 

matchItems.every(function(item) { 
    if(_.contains(items, item)) { 
     letter = item; 
     return false; 
    } 

    return true; 
}); 

return letter; 
+0

這將會更慢,因爲沒有休息條件 - 也許不是一個問題,如果只有幾個項目包括每個列表 – Wolfgang

+0

@沃爾夫岡足夠公平更新... – WalksAway

0

下面是一些變化。我不會說他們中的任何一個都是更合適的形式更好其中之一。 (除非你的定義 '好' 碰巧在那裏匹配的東西。)

// PROS: rather short 
 
// CONS: not efficient (the full intersection is computed) 
 
function test(items) { 
 
    var res = _.first(_.intersection(items, ['j', 'a', 'l'])); 
 
    return res === undefined ? 'd' : res; 
 
} 
 

 
console.log(test(['j', 'a'])); 
 
console.log(test(['x', 'y']));
<script src="http://underscorejs.org/underscore-min.js"></script>

// This one is close to WalkAways's 2nd method 
 
// PROS: rather short and rather efficient 
 
// CONS: slightly less readable 
 
function test(items) { 
 
    var res = _.find(['j', 'a', 'l'], function(c) { return _.contains(items, c); }); 
 
    return res === undefined ? 'd' : res; 
 
} 
 

 
console.log(test(['j', 'a'])); 
 
console.log(test(['x', 'y']));
<script src="http://underscorejs.org/underscore-min.js"></script>

// PROS: Jedi trick! 
 
// CONS: Jedi trick. Not very readable and inappropriate for a longer list. 
 
function test(items) { 
 
    return "djal"[ 
 
    _.contains(items, "j") && 1 || 
 
    _.contains(items, "a") && 2 || 
 
    _.contains(items, "l") && 3 || 0 
 
    ]; 
 
} 
 

 
console.log(test(['j', 'a'])); 
 
console.log(test(['x', 'y']));
<script src="http://underscorejs.org/underscore-min.js"></script>

作爲一個側面說明,以提高你的原始代碼的可讀性另一種簡單的方法可能是去除無用else聲明:

if(_.contains(items, "j")) return "j"; 
if(_.contains(items, "a")) return "a"; 
if(_.contains(items, "l")) return "l"; 
return "d"; 

(就個人而言,我可能會保持括號,而不是把ifreturn聲明在同一行。但這是一個有趣的問題。)