8

PHP でオブジェクトを作成し、JSON_encode 関数を使用して、JSON 文字列として ajax 経由で JS スクリプトに送信しました。次に、それをオブジェクトに戻します。私が抱えている問題は、オブジェクトを最初に作成された順序で保持したかったことです。JS にオブジェクトを取得したら、オブジェクトがどのように見えるかを次の図で確認してください。

ここに画像の説明を入力

オブジェクトを作成したとき、顧客フィールドのアルファベット順にソートされていました。A で始まる顧客名が最初に来て、B が 2 番目に続きます。ご覧のとおり、S で始まる顧客としてのオブジェクトの最初の要素です。どういうわけか、トップレベルのキーによって自動的にソートされたようです。オブジェクトは整数なので、なぜこれが起こったのか理解できます。

customerしたがって、すべてのサブオブジェクトがフィールドでアルファベット順にソートされるように、このオブジェクトを再ソートしたいと考えています。これは可能ですか?もしそうなら、どうすればいいですか?

ありがとう!

4

5 に答える 5

2

おそらく、JavaScript オブジェクトと JavaScript 配列の違いでしょう。オブジェクトは、キーが特定の順序でソートされていないハッシュ テーブルに似ていますが、配列は値の線形コレクションです。

バックエンドでは、オブジェクトではなく配列をエンコードしていることを確認してください。最終的にエンコードされた JSON を確認してください。オブジェクトのコレクションが [] ではなく {} で囲まれている場合は、配列ではなくオブジェクトとしてエンコードされています。

ID番号でオブジェクトにアクセスしようとしているように見えるため、問題が発生する可能性があります.ID番号は、それらのオブジェクトが最終的な配列で占有するインデックスであり、おそらく望んでいないため、別の問題を引き起こします.少量の値のみを保存する場合は、40,000 エントリの配列。

オブジェクトを反復処理するだけの場合は、オブジェクトではなく配列をエンコードしていることを確認する必要があります。特定の ID でオブジェクトにアクセスしたい場合は、オブジェクトをクライアント側でソートする必要があります (つまり、JSON 応答からオブジェクトを取得し、別の配列を作成してそれらのオブジェクトをソートする必要があります。ソートされたオブジェクトであり、id でそれらにアクセスすることもできます)。

効率的な並べ替えアルゴリズム (または以下の ELCas のアルゴリズムを使用) は、Google で簡単に見つけることができます。

于 2013-01-11T21:21:18.280 に答える
1

すべてのオブジェクトを配列にプッシュcustomerし、大文字と小文字を区別しない方法でプロパティで並べ替え、並べ替えられた配列を反復処理する一般的な反復関数を次に示します。

function iterate(data) {
  var arr = [];
  for (var prop in data) {
    if (data.hasOwnProperty(prop)) {
      var obj = {};
      obj[prop] = data[prop];
      obj.tempSortName = data[prop].customer.toLowerCase();
      arr.push(obj);
    }
  }
  arr.sort(function(a, b) {
    var at = a.tempSortName,
        bt = b.tempSortName;
    return at > bt ? 1 : ( at < bt ? -1 : 0 );
  });

  for (var i = 0, l = arr.length; i < l; i++) {
    var obj = arr[i];
    delete obj.tempSortName;
    console.log(obj);
    for (var prop in obj) {
      if (obj.hasOwnProperty(prop)) {
        var id = prop; //gets the obj "index" (id?)
      }
    }
    console.log(id);
    var item = obj[id];
    console.log(item.customer);
    //do stuff with item
  }
}

フィドル

于 2013-01-11T21:33:35.117 に答える
-3

データを循環して並べ替えるだけです。私は最も効率的なソーターを使用していませんが、アイデアはそこにあります。

var data = toArray(AJAX_Returned_JSON); // function to convert object to array
var sortedData = null;

for(var i=0; i<data.length - 1; i++){
  var temp = data[i];
  for(var j=i+1; j<data.length; j++){
    if(data[j].customer < temp.customer){
      temp = data[j];
    }
  }

  sortedData.push(temp);
}
于 2013-01-11T21:19:57.490 に答える