1

Web アプリ全体で誤動作が発生しており、オブジェクト/配列を並べ替えている for ループに行き着いていることに気付きました。

AJAX 経由で連想配列 (オブジェクト) を取得しています。返品時に構造を確認でき、正しいです。例えば:

48 => Value1
50 => Value2
49 => Value3
51 => Value4

しかし、それをループすると、for ループがオブジェクトを並べ替えます。これは、関連付けキーが数字であるためです。これらは、データベースからの数値 ID を表します。JavaScriptがそれらを窒息させ、それらを数値順に基本的な配列キーに変換しようとすることを知りませんでした。したがって、次のように吐き出されます。

48 => Value1
49 => Value3
50 => Value2
51 => Value4

ビルドした順序でオブジェクトをループするにはどうすればよいですか? 文字列をキーとしてオブジェクトを作成する必要がありますか? 22を置き換える「ID22」のように。または、JavaScriptを特定の順序で強制的にループさせる方法はありますか?

ありがとう!マット

4

3 に答える 3

1

JS オブジェクトは順不同であるため、特定の順序で JavaScript オブジェクトを反復する方法はありません。

この問題を解決する最良の方法は、1 つのオブジェクトと 1 つの配列を作成して順序を維持することです。

var values = {
  48: "Value1"
  50: "Value2"
  49: "Value3"
  51: "Value4"
}
var order = [48, 50, 49, 51] //put proterty id here to keep order eg. [51, 50, 49, 48]
于 2013-03-06T20:49:17.457 に答える
0

これはChromeの実際の問題であり、バグがありますが、内部効率のために「修正されません」です。

この問題を回避するために私が見つけた最善の方法は、オブジェクトを使用して変更することです。

{
  48: "Value1"
  50: "Value2"
  49: "Value3"
  51: "Value4"
}

代わりに次のような配列に:

[
  {id: 48, value: "Value1"},
  {id: 50, value: "Value2"},
  {id: 49, value: "Value3"},
  {id: 51, value: "Value4"}
]

最終的には、代替の回避策(最初に提案したとおり)よりもはるかにクリーンになります。

于 2013-03-06T20:51:25.333 に答える
0

キーと値を取得するために…inを使用していると思います。

上記のリンクにあるように、またECMAScript仕様で指定されているように、「プロパティを列挙するメカニズムと順序(最初のアルゴリズムのステップ6.a、2番目のアルゴリズムのステップ7.a)は指定されていません。」

for…inつまり、またはを介して取得する順序にまったく依存することはできませんObject.keys。注文が重要な場合は、注文のインデックスをどこかに保存し、そのプロパティでデータを並べ替える必要があります。そんなだけでは使えませんObject

于 2013-03-06T21:01:28.453 に答える