0

以前は配列の配列があり、並べ替え関数を使用して次のような適切な順序を取得していました。

var sampleArr = [
  [272, 'Some Title', 1, 1],
  [281, 'Some Other Title', 1, 2],
  [287, 'Another Title', 2, 1]
];

sampleArr.sort(sortCourses);

function sortCourses(a, b){
  if (a[3] == b[3]) {
    return (a[2] - b[2]);
  } else {
    return (a[3] - b[3]);
  }
}

これは望ましい結果ですが、id をプロパティとして、プロパティの値を次のような配列にするように変更しました。

var sampleObj = {
  272: ['Some Title', 1, 1],
  281: ['Some Other Title', 1, 2],
  287: ['Some Other Title 2', 2, 1]
};  

これにより、そのIDのルックアップで私たちの生活がずっと楽になりますが、それをソートする方法がわかりません.

これを達成するための最良の方法について誰かが光を当てることができますか? 関数を使用して配列に変換してから、同じ並べ替え関数を実行する必要がありますか? もしそうなら、どうすれば sampleObj を元の形式に変換できますか?

ありがとう。

4

2 に答える 2

3

現在、オブジェクト プロパティの反復処理はブラウザに任されています。すべてのブラウザーが反復可能なプロパティをソートするわけではないため、この動作をデフォルトとして想定するのは安全ではありません。

この他の質問はそれを説明することができます: "for (… in …)" ループ内の要素の順序

そのようなものを取得したい場合は、まだ標準ではないObject.keys()方法に依存し、結果の配列をソートしてから、それを使用してプロパティにアクセスする必要があります。

または、より移植性の高い別の方法として、すべてのオブジェクトのプロパティを配列で抽出し、その配列を並べ替え、それを反復処理してすべてのオブジェクト プロパティを抽出する関数を作成する必要があります。

于 2013-01-18T21:21:59.893 に答える
1

元の形式に戻すだけです。かんたんだよ:

var array = Object.keys(sampleObj).map(function(key) {
  return [Number(key)].concat(sampleObj[key])
})

Object.keys() は ECMAScript 5 関数であるため、このコードは IE6-8 では機能しませんが、基本的に他のすべてのブラウザーでは機能します。

于 2013-01-18T21:24:12.680 に答える