1

AJAX リクエストは、次のような JSON 文字列を返します。{"1015": {some data here}, "1001": {some data here}- JSON エンコードされた PHP 配列です。

jQuery.parseJSON関数は Javascript オブジェクトを返し、問題がどこにあるかを調べます: IE8 と FF4 は同じ要素の順序でオブジェクトを返します: 1015, 1001 (正しい方法だと思います), しかし、Opera11 と Chrome14 は反対の順序でオブジェクトを返します: 1001, 1015 (しかし先の JSON 文字列は同じです)。

この問題の回避策はありますか?

4

1 に答える 1

5

これはブラウザの問題ではなく、データ構造の誤用です。

配列は、順序付けられたオブジェクトのセットです。JavaScript コレクション/オブジェクトは、定義上、順序付けられていないセットです。ECMA 規格はこれを裏付けています。

クロム V8 プロジェクトには比較的古い問題があり、この件に関して長い議論があります: http://code.google.com/p/v8/issues/detail?id=164

その要点は、Chrome と Opera (および実際には IE9) がオブジェクトの数値キーのメンバーを並べ替え、文字列キーを持つメンバーの前に配置することです。これは、オブジェクトにアクセスする際の効率上の理由から行われ、これらのブラウザーで意図したとおりに機能しています。FF と IE < 9 は、順序付けされるべきではない構造の順序を保持しています。それらは何も悪いことをしていませんが、その動作は Chrome、Opera、および IE9 の動作よりも適切ではありません。

プロジェクトでこれを解決するには、基本的に次の 3 つの方法があります。

  1. データに array_values() を呼び出して、非関連付けにします。json_encode すると、デフォルトで配列としてエンコードされます。順序は、PHP で定義された順序になります。キーを失いたくないので、オブジェクト データに格納する必要があります。これは推奨される解決策であり、長期的に壊れる可能性が最も低くなります。

  2. データの順序を定義し、それをオブジェクト データとともに配列として渡します。実際に必要以上のデータを渡すことになり、クライアントに負担がかかるため、上記ほど大きくはありません。

  3. キーを文字列に変換し、各キーの先頭または末尾にアルファ文字を付けます。これは、レガシー プロジェクトで作業していて、アーキテクチャをほとんど制御できない場合にのみ有効なオプションです。

実際には、開発者として、順序付けされていないオブジェクトの順序が保持されるという保証はありません。Web 標準がその方向に進み、ECMA 標準と将来の標準のドラフトがルールを作成し続けるにつれて、他のブラウザーはこの動作に移行します。今のうちに調整してもいいでしょう。

教訓: 順序を維持する必要がある場合は、配列を使用します。

于 2011-10-24T21:24:50.923 に答える