表达式匹配

问题描述:

我有一个类似于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中?

我不知道现有的,干净的,解决方案,但这里是一个简单的实现符合你的例子:

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]),因此您需要单独比较元素。