У меня есть функция, которая создает фильтры для некоторых данных. Фильтры добавляются в массив, а затем (позже) связываются через reduce
функция (связующая часть не является частью моего вопроса).
Все данные, которые я получаю, представляют собой строки, но на самом деле могут быть числами, например {name:"-45.6"}
. Если это может быть число, я хочу, чтобы значение было преобразовано в число.
formFilters = (builder) => {
const filters = [];
builder.forEach(b => {
let {filtername, operator, value} = b;
if(!value) return;
if(isNumber(value)){
value = Number(value);
}
switch (operator) {
case "=":
filters.push((item) => convertToNumber(item[filtername]) === value);
break;
case "<":
filters.push((item) => convertToNumber(item[filtername]) < value);
break;
case ">":
filters.push((item) => convertToNumber(item[filtername]) > value);
}
});
return filters;
}
function convertToNumber(value){
const number = Number(value);
if (!Number.isNaN(number)) return number;
return value;
}
Это работает, но мне интересно, есть ли более чистый способ преобразования значения в число, если это число?
1 ответ
Одна проблема с Number(value);
это то, что бросает фальшивка ценности как 0
и правдивый ценности как 1
.
Это означает, что пустая строка становится 0
, что может быть не тем, что вы ожидаете.
Вы могли бы сделать регулярное выражение проверьте ввод, чтобы определить, соответствует ли он вашим ожиданиям от числа.
let input = document.getElementById('input');
let result = document.getElementById('result');
function IsANumber() {
let isItANumber = input.value.match(/^-?d*.?d+$/);
result.innerHTML = isItANumber ? 'true' : 'false';
}
<input id="input" onchange="IsANumber()" onkeyup="IsANumber()" /><br/> Is a number: <span id="result"></span>
Приведенный выше пример не будет ошибочным в случаях правдивости / ложности, но он определит, что такие строки, как «Бесконечность», тоже не будут числами. Поэтому может потребоваться изменить его, если вам нужно преобразовать их в числовые значения.
Функция не работает для таких чисел, как
"1e2"
,"0x10"
,"0b00"
возвращает false.— Слепой67