2013-02-11 125 views
3

當我有一個網址是這樣的:約定的查詢字符串參數

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

我明白,在我的JavaScript的姓名查詢應該返回「傑克」。

但是應該怎樣查詢在下列情況下姓回報:

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 
+2

取決於您如何創建該功能。 – Dom 2013-02-11 18:06:59

+0

獲取查詢字符串數據,同時您可以忽略無效的查詢字符串參數,並顯示結果集的有效參數 – 2013-02-11 18:07:16

+0

@Dom,這就是爲什麼我查詢通常的約定 – Christophe 2013-02-11 18:08:09

回答

0

但是應該怎樣查詢返回

這是你的決定,你需要什麼?有幾個不同複雜度的查詢字符串評估函數。其中一些可以處理重複的,嵌套的,括號語法值,其他則不可以。着名的可以在How can I get query string values in JavaScript?及其重複問題中找到。

但是,你問約定:

http://server/site?lastname=Daniels

結果應該是falsy表示沒有firstName。您可以選擇nullundefined

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

這往往代表了一些布爾參數,所以返回true將是合法的。但我確定有些庫完全忽略了這種格式。

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

這是相當明顯的空字符串""

+0

Thx!我沒有想到爲第二種情況返回正確。你有參考證明它是標準的嗎? – Christophe 2013-02-11 18:35:40

+0

由於這些功能都沒有標準化,所以幾乎沒有參考。當然你可以看看流行的js庫中的URL解析函數的文檔。 – Bergi 2013-02-11 18:40:40

+0

好點。任何推薦(AFAIK jQuery沒有) – Christophe 2013-02-11 18:42:09

1

但應在下列情況下名字返回查詢的內容:

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先後爲firstname鍵的undefined值。
  • ?firstname&lastname=Daniels對於firstname密鑰具有值null
  • ?firstname=&lastname=Daniels對於firstname密鑰的值爲''

對於基於其存在性將鍵用作布爾值的情況,您應該檢查對象是否具有鍵集(並且完全忽略該值,因爲它無關緊要)。

這通常與obj.hasOwnProperty('key')做,但是作爲對象真的是越來越散,Object.prototype.hasOwnProperty.call(obj, 'key') is preferrable,這可能是抽象成一個has功能:如果您使用underscore.js

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

,那麼你可以使用_.has(obj, key)

+0

這非常有意義。事實上,我正在使用一個對象來存儲參數。與@ Bergi的答案不同的是第二種情況。 – Christophe 2013-02-11 19:36:17

+1

@Christophe,Bergi對使用布爾鍵做了一個很好的說明,但是如果你使用查詢字符串的對象表示,你應該使用'obj.hasOwnProperty('key')'來檢查鍵是否存在在對象中。其實,即使這是錯誤的,[你應該*真正*使用像'has(obj,'key')'](http://www.devthought.com/2012/01/18/an-object-is-不-A-散列/)。 – zzzzBov 2013-02-11 19:43:39