3

私がこのようなURLを持っているとき:

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

私のJavaScriptでは、名のクエリは「Jack」を返す必要があることを理解しています。

ただし、次の場合、名のクエリは何を返す必要がありますか。

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

</脇>

元の質問に戻ると、これが意味することは次のとおりです。

  • ?lastname=Danielsキーの値はundefinedです。firstname
  • ?firstname&lastname=Danielsキーの値はnullです。firstname
  • ?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

結果は、 が存在しないことを表す偽物になるはずですfirstNamenullまたはを選択できますundefined

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

これは多くの場合、ブール値のパラメーターを表すため、返すtrueことは正当です。それでも、この形式を完全に無視するライブラリがあると確信しています。

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

それは明らかに空の文字列""です。

于 2013-02-11T18:31:19.777 に答える