Преобразовать строковое представление оператора сравнения в реальный оператор сравнения
Я пытаюсь создать динамическую функцию в 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.");
}