2016-05-24 34 views
1

我試圖在JavaScript中創建一個動態函數,我可以將一個對象與另一個對象進行比較,將比較運算符作爲字符串值傳遞給該函數。將比較運算符的字符串表示形式轉換爲實際的比較運算符

例如兩個對象是這樣的:

{value: 1, name: "banana"} 
{value: 2, name: "apples"} 

我要香蕉比蘋果,是有辦法,我可以通過一個比較操作的字符串表示,然後用它作爲一個實際的比較操作功能?

function compare (first, second, comparator) { 

    return first.id (comparator) second.id; 

} 

e.g compare(apple,banana,"<="); 
//return true 

compare(apple,banana,"==="); 
//return false 

授予我可以用一個開關或者執行上比較字符串聲明即

if (comparator === "<=") 
    return first.id <= second.id 
    if (comparator === "===") 
    return first.id === second.id 

,但我不知道是否有任何更好更有效的方式來做到這一點,避免需要這樣的switch/if語句。

+0

'回報的eval(「first.id‘+比較+’second.id」);' –

+1

通常情況下一個將是比較行爲的函數,通過這個。你可以預先定義它們,所以你可以把它們稱爲LESSTHAN等等。然後在你的'比較'函數中,你需要做的就是調用這個函數。 –

回答

1

儘管在某些語言中這可能是可能的,但JavaScript不是其中之一。

我個人認爲這是一個壞主意,因爲它危險地接近eval領土。我想你應該列入白名單的經營者,並定義它們的行爲:

switch(comparator) { 
    case "<=": return first.id <= second.id; 
    case "===": return first.id === second.id; 
    // ... 
    // you can have synonyms: 
    case ">=": 
    case "gte": return first.id >= second.id; 
    // or even nonexistant operators 
    case "<=>": // spaceship! 
     if(first.id === second.id) return 0; 
     if(first.id < second.id) return -1; 
     return 1; 
    // and a catch-all: 
    default: 
     throw new Error("Invalid operator."); 
}