Преобразовать строковое представление оператора сравнения в реальный оператор сравнения

Я пытаюсь создать динамическую функцию в 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 в строке компаратора, т.е.

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

но мне интересно, есть ли лучший, более эффективный способ сделать это, чтобы избежать необходимости в таком выражении switch / if.

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.");
}
Другие вопросы по тегам