2011-06-11 74 views
3

我有一個類似於this one的問題,除了用JavaScript代替C#。表達式匹配

基本上,我希望能夠做的模式匹配上的表達,而不是使用的if聲明一長串的,就像這樣:

var person.annoyingAction = match([person.gender, person.ageGroup], 
     [male, child], breakingStuff, 
     [male, teenager], drivingRecklessly, 
     [male, adult], beingLazyAfterComingHomeFromWork 
     [female, child], screechingInAnUnbelievablyHighPitchedVoice, 
     [female, teenager], knowingEverything, 
     [female, adult], askingPeopleIfTheyThinkIAmTooFat 
     [_, baby], cryingEveryTwoHoursAtNight, 
     [_,_], beingHuman); 

有誰知道如何實現的東西,會做這樣的事情這在Javascript中?

回答

1

我不知道現有的,乾淨的,解決方案,但這裏是一個簡單的實現符合你的例子:

var match = function(target) { 
    for (i = 1; i < arguments.length; i += 2) { 
    if (target[0] == arguments[i][0] && target[1] == arguments[i][1]) { 
     return arguments[i + 1]; 
    } 
    } 
} 

使用例:

var result = match(["Yellow", "Food"], 
    ["Red", "Food"], "Apple", 
    ["Green", "Plant"], "Grass", 
    ["Yellow", "Thing"], "Schoolbus", 
    ["Yellow", "Food"], "Banana", 
    ["Yellow", "Foot"], "Bad" 
) 

alert(result) # displays "Banana" 

在JavaScript中,你可以不直接比較數組([1, 2] != [1, 2]),因此您需要單獨比較元素。