我想从查询字符串的参数推断出类型(使用Javascript)。
示例网址:
http://example.com/some/path/here/?someString=Hey&someNumber=20
我已经使用了几个包(query-string
和simple-query-string
),如下所示:
queryString.parse(request.url)
request.url
是上面的网址。这给出了以下内容:
{
"someString":"Hey",
"someNumber":"20"
}
上面的someNumber
类型为string
。期望的结果是:
{
"someString":"Hey",
"someNumber":20
}
someNumber
的类型为integer
。
我想要integer
类型的原因是因为我正在对参数执行JSONSchema验证,这些参数指定了每个命名参数允许的类型。
我知道我可以投射这些实例,但我更喜欢它是否可以从包中获得,因为它感觉就像重新发明轮子一样。
答案 0 :(得分:1)
这应该可以解决问题。您可以添加更多/不同的正则表达式测试,以补充现在的简单数字检查(例如,检测日期,美元金额,电话号码等)。
var exampleurl = "http://example.com/some/path/here/?someString=Hey&someNumber=20"
function getQueryStringData(url){
var data = url.split('?')[1].split('&'),
numberRgx = /^\d+(\.\d+)?$/
return data.reduce(function(obj, t){
var pair = t.split('='),
key = pair[0],
val = pair[1]
obj[key] = numberRgx.test(val) ? parseFloat(val) : val
return obj
}, {})
}
var obj = getQueryStringData(exampleurl)
console.log(obj)
document.getElementById('output').textContent = JSON.stringify(obj)
<div id="output"></div>
答案 1 :(得分:0)
这是一种类型化对象属性的方法。如果字符串本身是表达式中的特殊匹配之一,则JSON.parse它,否则尝试Number,否则保持原样。
function cast (o) {
var result = {};
for(var prop in o) { if(o.hasOwnProperty(prop)) {
var val = o[prop];
if (typeof val === 'object') return o[prop] = cast(val);
result[prop] = /^(true|false|null|undefined)$/.test(val) ? JSON.parse(val) : Number(val) || val;
}}
return result;
}
cast( { a: '123', b: 'null', c: 'abc' } )
返回{a: 123, b: null, c: "abc"}