如何在没有正则表达式的情况下安全地区分在 queryParams

例如,我在 url als 查询参数中存储了一个日期和金额属性


...?日期=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;

在这种情况下,amount=20000 将被 Date.parse 识别。



2019-06-12T06:20:39.465Z 将使用 parseInt 解析为 2019 ...


isFinie、parseInt 和 isInteger 是从 lodash 导入的。


如果可能,我不想使用正则表达式。


编辑:请假设我不知道密钥的名称。因此脚本应该适用于所有属性。


HUH函数
浏览 133回答 2
2回答

繁星coding

使用+operator、Number函数或 lodash_.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'))

慕容森

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;  }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript