2014-11-03 79 views
2

我正在寫'塔羅牌'讀卡器,我已經到了必須添加'預測'的部分。 唯一的問題是,我意識到將會有40多個可能的答案。替代開關/ if else語句?

而不是寫40+開關的情況下,有沒有更快的方法來比較兩個變量和輸出的東西呢?

謝謝!

+2

另一種方法是使用表格。例如,該表可以具有預期結果的範圍,然後是相應的答案。 – 2014-11-03 05:23:50

+0

取決於您的數據設置方式,您可以使用類似的循環。如果條件非常獨特,那麼您正在查看大量條件語句 – 2014-11-03 05:24:03

回答

1

將您的數據存儲在可根據兩個變量的相應值進行遍歷的分層結構中。通過這種方式確定數值就像解引用對象一樣簡單:options[variable1][variable2]。看下面的例子。

在代碼片段中,兩個下拉列表控制着兩個變量的值。

var options = { 
 
    "A": { "C": 1, "D": 2 }, 
 
    "B": { "C": 3, "D": 4 } 
 
} 
 

 
$(function() { 
 
    $("#dd1, #dd2").change(function() { 
 
     var opt1 = $("#dd1").val(); 
 
     var opt2 = $("#dd2").val(); 
 
     var value = options[opt1][opt2]; 
 
     $("#result").text(value); 
 
    }); 
 
    $("#dd1").change(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<select id="dd1"> 
 
    <option>A</option> 
 
    <option>B</option> 
 
</select> 
 
<select id="dd2"> 
 
    <option>C</option> 
 
    <option>D</option> 
 
</select> 
 
<div id="result"></div>

+0

總是驚訝於關於基本ECMAScript的問題如何提示依賴於DOM庫的答案。 – RobG 2014-11-03 06:11:47

+0

@RobG答案與DOM庫無關。答案是將數據放在JS對象中並相應地引用。 DOM庫純粹用於演示,因爲鍵入'document.getElementById'比'$(「#...」)'更有效。儘管我只是做了它... – nbrooks 2014-11-03 06:14:16

+0

'$(「#dd1」)。val()'更簡單快捷,因爲'this.value',所以可以省去一些鍵入。 :-)但是OP甚至沒有提到「DOM」,顯然這個部分是分類的(如果需要的話)。 – RobG 2014-11-03 06:22:17

0

通過所有的答案使用一個查找表和循環。你可能想用咖啡或lodash來處理循環

0

我不知道你試圖實現什麼算法,你沒有提供它。但是,如果你正在尋找補卡值,那麼對象是一個解決辦法:

// cards is an array of cardNames to get the value of 
function getValues(cards) { 
    var values = { 
    cardName0: value, 
    cardName1: value, 
    cardName2: value, 
    ... 
    } 
    var result = 0; // String? Number? 

    for (var i=0, iLen=cards.length; i<iLen; i++) { 
    result += values[cards[i]]; 
    } 

    return result; 
} 

也許結果映射到一些明智的建議值,使用另一個對象。也許甚至可以隨機選擇其中一條說5條類似的建議。

0

也許就像一個查找表:

var tarotLookup={ 
    death:"something bad going to happen!", 
    hermit:"so lonely!", 
    pope:"", 
    moon:"spoooky!" 
}; 
var tarotResults=["death","hermit","pope","moon"]; 
var predictions=tarotResults.map(function(id){ 
    var msg=tarotLookup[id]; 
    return [id,msg?msg:"(no entry)"].join(": "); 
}); 
predictions.join("\n"); 

//output result: 
/* 
death: something bad going to happen! 
hermit: so lonely! 
pope: (no entry) 
moon: spoooky! 
*/ 

您需要確保沒有鑰匙的意外匹配的對象原型屬性/方法的名稱(這可能不是一個問題塔羅牌名稱)。在這種情況下,從Object.create(null)製作查找表,或在密鑰前加上以防止發生這種衝突。