gpt4 book ai didi

javascript - 查询字符串参数的约定

转载 作者:可可西里 更新时间:2023-11-01 14:53:13 26 4
gpt4 key购买 nike

当我有这样的 url 时:

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

最佳答案

But what should the query for firstname return in the following cases:

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

还有一个经常被忽视的情况,即多次使用同一个 key 。在传统的查询字符串语法(不是 PHP)中,键可以按原样多次使用来表示一个数组。

这意味着对于 ?foo=bar&foo=baz 生成的对象应该是:

{
foo: [
'bar',
'baz'
]
}

<旁白>

在 PHP 领域,用于数组的键以 [] 为后缀:

`?foo[]=bar&foo[]=baz`

PHP 将自动转换查询字符串服务器端,这样:

$_GET['foo'] = array('bar', 'baz')

回到最初的问题,这意味着:

  • ?lastname=Danielsfirstname 键值为 undefined
  • ?firstname&lastname=Danielsfirstname 键值为 null
  • ?firstname=&lastname=Danielsfirstname 键值为 ''

对于根据键的存在将键用作 bool 值的情况,您应该检查对象是否设置了键(并完全忽略该值,因为它无关紧要)。

通常这是通过 obj.hasOwnProperty('key') 完成的,但是由于对象实际上更像是一个哈希,Object.prototype.hasOwnProperty.call(obj, 'key') is preferrable ,可以抽象成一个has函数:

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

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

关于javascript - 查询字符串参数的约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14818101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com