3

当我有这样的网址时:

http://server/site?firstname=Jack&lastname=Daniels

我知道在我的 JavaScript 中,对名字的查询应该返回“Jack”。

但是在以下情况下,firstname 的查询应该返回什么:

http://server/site?lastname=Daniels
http://server/site?firstname&lastname=Daniels
http://server/site?firstname=&lastname=Daniels

[编辑]回答一些评论:以上都是合法的查询字符串,我的问题不是关于如何检索参数,而是如何解释它们。

作为记录,我使用以下涵盖所有情况的正则表达式解析查询字符串:

/([^?=&;]+)(?:=([^&;]*))?/g

显然有一个关于如何检索查询字符串参数的非常流行的问题,但答案是不正确的(或者至少没有解决边缘情况)。

[更新] 我的选择基于@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
4

2 回答 2

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')

</aside>

回到最初的问题,这意味着以下内容:

  • ?lastname=Daniels键的值为undefinedfirstname
  • ?firstname&lastname=Daniels键的值为nullfirstname
  • ?firstname=&lastname=Daniels键的值为''firstname

对于基于其存在将键用作布尔值的情况,您应该检查对象是否具有键集(并完全忽略该值,因为这无关紧要)。

通常这是用 来完成的obj.hasOwnProperty('key'),但是由于对象实际上更像是一个散列,Object.prototype.hasOwnProperty.call(obj, 'key')因此是优选的,它可以被抽象为一个has函数:

has(obj, key) {
    return Object.prototype.hasOwnProperty.call(obj, key);
}

如果您使用underscore.js,那么您可以使用_.has(obj, key)

于 2013-02-11T19:13:02.670 回答
0

但是查询应该返回什么

那是你的决定,你需要什么?有几个不同复杂度的查询字符串评估函数。其中一些可以处理重复的、嵌套的、括号语法值,而另一些则不能。著名的可以在如何在 JavaScript 中获取查询字符串值?及其重复的问题。

但是,您要求约定:

http://server/site?lastname=Daniels

结果应该是虚假的,以表示不存在firstName。您可以选择nullundefined

http://server/site?firstname&lastname=Daniels

这通常代表一些布尔参数,因此返回true是合法的。但是我确信有些库完全忽略了这种格式。

http://server/site?firstname=&lastname=Daniels

这很明显是空字符串""

于 2013-02-11T18:31:19.777 回答