2016-05-24 15 views
1

Ich versuche eine dynamische Funktion in JavaScript zu erstellen, in der ich ein Objekt mit einem anderen vergleichen kann und den Vergleichsoperator als String-Wert an die Funktion übergebe.Konvertiere eine String-Repräsentation eines Vergleichsoperators in einen tatsächlichen Vergleichsoperator

Beispiel zwei Objekte wie folgt aus:

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

I Banane Apfel vergleichen wollen, ist es eine Möglichkeit, eine String-Darstellung eines Vergleichsoperator passieren kann und es dann als Ist-Vergleich Operator in einem Funktion?

function compare (first, second, comparator) { 

    return first.id (comparator) second.id; 

} 

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

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

etc

Zugegeben ich mit einem Schalter oder wenn Aussage über den Komparator String dh

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

implementieren könnte, aber ich frage mich, ob es eine bessere effizienter Weg, es zu tun, dass vermeidet die Notwendigkeit für eine solche switch/if-Anweisung.

+0

'return eval („first.id ‚+ Komparator +‘ second.id“);' –

+1

Normalerweise würde man das Vergleichsverhalten als eine Funktion darstellen, und geben Sie das ein. Sie könnten sie so vordefinieren, dass Sie sie als LESSTHAN usw. bezeichnen könnten. Dann müssen Sie in Ihrer "compare" -Funktion nur die Funktion aufrufen. –

Antwort

1

Während dies in einigen Sprachen möglich ist, gehört JavaScript nicht dazu.

Persönlich denke ich, es ist eine schlechte Idee, wie es gefährlich nahe eval Territorium kommt. Ich denke, Sie sollten die Betreiber die weiße Liste setzen und ihr Verhalten definieren:

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."); 
} 
Verwandte Themen