как безопасно различать строку и число ISO 8601, хранящиеся в виде строки в queryParams без регулярных выражений - PullRequest
0 голосов
/ 13 июня 2019

Например, у меня есть свойство даты и количества, сохраненное в параметрах запроса URL

...? Date = 2019-06-12T06: 20: 39.465Z & amount = 20000

Я хочу иметь возможность анализировать ВСЕ параметры запроса и присваивать им правильный тип с помощью javascript.

в настоящее время я использую

        paramMap.keys.forEach(key => {
            let value: any = paramMap.get(key);
            if (isFinite(Date.parse(value))) {
                // keep as string
            } else if (isFinite(parseInt(value, 10))) {
                value = isInteger(value) ? parseInt(value, 10) : parseFloat(value);
            } else if (value === 'true' || value === 'false') {
                value = value === 'true';
            }
            obj[key] = value;
        });
        return obj;

В этом случае сумма = 20000 будет распознана Date.parse.

также

2019-06-12T06: 20: 39.465Z будет проанализирован до 2019 с помощью parseInt ...

isFinie, parseInt и isInteger импортированы из lodash.

Если возможно, я не хочу использовать регулярное выражение.

РЕДАКТИРОВАТЬ: Пожалуйста, предположите, что я не знаю название ключа.Следовательно, скрипт должен работать для всех свойств.

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

ISO может пропускать секунды, часовые пояса или миллисекунды, но если вы проигнорируете их и проверите все остальное, вы сможете надежно проверить соответствие различным форматам ISO.

console.log(isISO('2019-06-12T06:20:39.234Z'))
console.log(isISO('2019-06-12T06:20:39'))
console.log(isISO('2019-06-12T06:20'))

console.log(isISO("2019-1-1"))
console.log(isISO('2019-06-12T06:20:39+05'))

console.log(isISO('ketchup'))

function isISO(str) {
  try {
    str = str.split('+')[0];
    var iso = new Date(str).toISOString();
    var [date, time] = iso.split('T');
    var [y, m, d] = date.split('-');
    return iso.indexOf(`${y}-${m}-${d}`) === 0;
  } catch (e) {
    return false;
  }
}
1 голос
/ 13 июня 2019

Используйте оператор + , функцию Number или код Лодаша _.toNumber(), который вернет NaN для строк со смешанными числами:

console.log(+'2019-06-12T06:20:39.465Z')

console.log(+'20000')

Итак, логика будет такой:

const parseParam = value => {
  let v = +value

  if (!isNaN(v)) return v

  v = Date.parse(value)

  if (!isNaN(v)) return v

  if (value === 'true' || value === 'false') return value === 'true'

  return value
}

console.log(parseParam('2019-06-12T06:20:39.465Z'))
console.log(parseParam('20000'))
console.log(parseParam('false'))
console.log(parseParam('cats'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...