Проверка наличия значения переменной в массиве. JS
Вопрос (как мне кажется) просто до невозможности.
Есть массив excludeTypes в котором один элемент: ["21"].
Есть переменная procedure_types в которую попадаются разные числовые значения.
Мне нужно написать условие при котором если excludeTypes содержит значение procedure_types, то будут выполняться определенные действия.
Как в JS выглядит такое условие?
excludeTypes.includes(procedure_types) выдаёт ошибку, при этом по отдельности они оба содержат 21.
Ответы (3 шт):
const excludeTypes = ["21"];
const procedure_types_number = 21;
console.log(excludeTypes.includes(procedure_types_number));
const procedure_types_string = "21";
console.log(excludeTypes.includes(procedure_types_string));
Мне нужно написать условие при котором если
excludeTypesсодержит значениеprocedure_types, то будут выполняться определенные действия. Как в JS выглядит такое условие?
excludeTypes.includes(String(procedure_types))
То есть, раз в массиве строки - и проверяемые значения надо приводить к строковому типу.
excludeTypes.includes(procedure_types)выдаёт ошибку, при этом по отдельности они оба содержат21.
Предлагаю массив excludeTypes преобразовать в объект.
Плюсы такого решения:
это устранит необходимость выполнять явное приведение типа значений
(проверки значений'21'и21будут давать одинаковый результат)ускорится выполнение проверок
(хотя эффект будет ощутим только если их будет много)выражение условия с оператором
ifупростится доif (excludeTypes[procedure_types]) { .... }
Пример с преобразованием в объект через reduce:
const excludeTypes = ['21'].reduce(
(rslt, t) => ((rslt[t] = true), rslt)
, Object.create(null));
let procedure_types = '21';
console.log(excludeTypes[procedure_types]);
procedure_types = 21;
console.log(excludeTypes[procedure_types]);
В примере используется обычный базовый объект без прототипа (точнее, с null в прототипе) - так сделано для того, чтобы исключить возможное совпадение проверяемых значений с именами прототипных свойств Object.
Нюанс: Такая реализация подходит только для некоторых типов значений, в первую очередь для string и number (и по задумке, и по задаче заданного вопроса). Если же возникнет потребность проверять так же объектные значения, а не только числовые и строковые, то этот способ уже не подойдет - потому что объекты не могут использоваться в роли ключей обычного базового object'а.
Спасибо всем, кто подсказал про разность типов значений и посоветовал как лучше привести к одному типу.
В итоге реализовал следующим образом:
procedure_type = String(procedure_type);
excludeTypes.indexOf(procedure_type) > -1
.includes не подходит для браузеров IE (по крайней мере старых версий).