当我有这样的网址时:
http://server/site?firstname=Jack&lastname=Daniels
据我所知,在我的JavaScript中,firstname的查询应返回“Jack”。
但是在下列情况下,firstname的查询应该返回什么:
http://server/site?lastname=Daniels
http://server/site?firstname&lastname=Daniels
http://server/site?firstname=&lastname=Daniels
[编辑]回答一些评论:以上所有都是合法的查询字符串,我的问题不是如何检索参数,而是如何解释它们。
为了记录,我使用以下涵盖所有情况的正则表达式解析查询字符串:
/([^?=&;]+)(?:=([^&;]*))?/g
显然有a very popular question on how to retrieve querystring parameters,但答案不正确(或者至少没有解决边缘情况)。
[更新]我的选择基于@Bergi和@zzzzBov的答案:
http://server/site?lastname=Daniels => firstname: undefined
http://server/site?firstname&lastname=Daniels => firstname: true
http://server/site?firstname=&lastname=Daniels => firstname: ""
http://server/site?firstname=Jack&lastname=Daniels => firstname: "Jack"
副作用是我必须稍微修改我的正则表达式,因为上述规则需要捕获=
符号:
/([^?=&;]+)(=[^&;]*)?/g
答案 0 :(得分:1)
但是在下列情况下,firstname的查询应该返回什么:
http://server/site?lastname=Daniels http://server/site?firstname&lastname=Daniels http://server/site?firstname=&lastname=Daniels
查询字符串可以很容易地用JavaScript中的对象表示法表示。只需设置对象上查询字符串中存在的键即可。
这意味着对于?lastname=Daniels
,生成的对象应为:
{
lastname: 'Daniels'
}
如果密钥存在但没有给出值(没有等号),则密钥应设置为null
,表示“无值”。
这意味着对于?firstname&lastname=Daniels
,生成的对象应为:
{
firstname: null,
lastname: 'Daniels'
}
如果密钥存在且提供的值为空(等号),则该值实际上为空字符串。
这意味着对于?firstname=&lastname=Daniels
,生成的对象应为:
{
firstname: '',
lastname: 'Daniels'
}
还有一个经常被忽视的情况是多次使用相同的密钥。在传统的查询字符串语法(不是PHP)中,可以按原样多次使用键来表示数组。
这意味着对于?foo=bar&foo=baz
,生成的对象应为:
{
foo: [
'bar',
'baz'
]
}
<一旁>
在PHP中,用于数组的键后缀为[]
:
`?foo[]=bar&foo[]=baz`
PHP将自动转换查询字符串服务器端,以便:
$_GET['foo'] = array('bar', 'baz')
< /预留>
回到最初的问题,这意味着以下几点:
?lastname=Daniels
的{{1}}密钥值为undefined
。firstname
的{{1}}密钥值为?firstname&lastname=Daniels
。null
的{{1}}密钥值为firstname
。对于根据其存在使用键作为布尔值的情况,您应该检查对象是否具有键集(并且完全忽略该值,因为它无关紧要)。
通常这是使用?firstname=&lastname=Daniels
完成的,但是因为对象实际上更像是一个哈希Object.prototype.hasOwnProperty.call(obj, 'key')
is preferrable,它可以被抽象为''
函数:
firstname
如果您使用的是underscore.js,则可以使用_.has(obj, key)
答案 1 :(得分:0)
但是查询应该返回什么
这是你的决定,你需要什么?有几种不同复杂度的查询字符串评估函数。其中一些可以处理重复的,嵌套的括号语法值,而另一些则不能。着名的可以在How can I get query string values in JavaScript?及其重复的问题中找到。
但是,您要求约定:
http://server/site?lastname=Daniels
结果应该是表示缺少firstName
的虚假事物。您可以选择null
或undefined
。
http://server/site?firstname&lastname=Daniels
这通常代表一些布尔参数,因此返回true
将是合法的。但我确信有些库完全忽略了这种格式。
http://server/site?firstname=&lastname=Daniels
这显然是空字符串""
。