2011-09-14 14 views
4

私のJavascriptアプリケーションでは、オブジェクトがあり、内部オブジェクト内の値で配列を並べ替えることができる必要があります。例えばJavascriptオブジェクトを値で並べ替える

:私がする必要がどのような

{ 
    a : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    b : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    c : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    } 
} 

は、このデータセットと再順序配列は、各内部オブジェクトのタイムスタンプに応じて管理しています。

これを行うにはどのような方法がありますか?

更新:

私の最初の考えはそうのような何かをすることになります。

{ 
    a : {}, 
    b : {}, 
    c : {}, 
    _ : [ 
     c, a, b //Key's Only 
    ] 
} 

それらの値に基づいて、次に再インデックスオブジェクト、どのようにインデックスオブジェクトをに整理しますが、私は新しい要素を挿入するときにも、私は多くの努力のように思われる_インデックス関係を再生成する必要があります。

答えて

2

Javascriptオブジェクトはではなく、連想配列です。彼らは同様に振る舞いますが、同じではありません。 Javascriptには連想配列はありません。

連想配列は順序の概念を持っていますが、Javascriptオブジェクトは単にこの特定の機能をそれらと共有しません。オブジェクトは、本質的には本質的に、注文されていません。だから、

、あなたの質問に答える:あなたがそれらを注文することができない...

+1

確かにオブジェクトには順序はありませんが、解決策がない可能性はありません。 – jondavidjohn

+0

インデックスを作成し、キー値と "順序"のハッシュテーブルを作成し、必要に応じて1つの配列からオブジェクトへの参照を使用する – Miguel

2

あなたは無あり、配列が、aのプロパティ値を持つオブジェクト、b、およびc

を扱っていません特定の順序で実際にループすることはできないため、特定の順序でそれらを必要とする理由があります。

これは他の人がすでに述べたように、あなたが連想オブジェクトを扱っている

var array = [ 
    { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    { 
     timestamp: xxxxxx 
     other : yyyyyy 
    } 
]; 

array.sort(function(a,b) { 
    return a.timestamp - b.timestamp; 
}); 
+0

配列の問題は、文字列ベースのインデックスを持たず、必要な文字列ベースのインデックスで。 – RobertPitt

+0

すべてのJavaScriptインデックス***は***文字列とJavaScript配列***は***オブジェクトです、彼らはちょっとした便利な機能を持っています...あなたは具体的に後... http://jsfiddle.net/Mb8xC/ – jondavidjohn

2

...あなたはが配列で作業をした場合(使用)些細なことでしょう。配列ではありません。オブジェクトには順序がありません。

あなたは、あるとして、それを維持し、代わりにキーの配列をソートしたい場合は、あなたがこれを行うことができます:

var obj = { 
    a : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    b : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    c : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    } 
}; 

var keys = []; 
for(var key in obj) { 
    keys.push(key); 
} 

keys.sort(function(a, b) { 
    return obj[a].timestamp - obj[b].timestamp; 
}); 

今、あなたはキー[例えばOBJ(配列の値を経由してオブジェクトにアクセスすることができます[0]]、obj [keys [1]]など)。これは、タイムスタンプが数値であることを前提としています。彼らは日付がオブジェクトであれば、ソートは次のようになります。

keys.sort(function(a, b) { 
    return +obj[a].timestamp - (+obj[b].timestamp); 
}); 

タイムスタンプが実際に(「2012年8月2日」のような)日付時刻を表す文字列である場合、それは次のようになります。だから、

keys.sort(function(a, b) { 
    return +new Date(obj[a].timestamp) - (+new Date(obj[b].timestamp)); 
}); 

あなたのシナリオで最も理にかなったものを使用してください。

0

カスタムの比較関数を作成し、配列に組み込みの並べ替え関数を使用することができます。これはpostを参照してください。

6

あなたは、配列にデータをコピーし、それを並べ替えることができます。

var data = { 
    a : { 
     timestamp: 11111, 
     other : "xxx" 
    }, 
    b : { 
     timestamp: 22222, 
     other : "yyy" 
    }, 
    c : { 
     timestamp: 33333, 
     other : "zzz" 
    } 
}; 

var output = []; 

// copy items to an array so they can be sorted 
for (var key in data) { 
    data[key].key = key; // save key so you can access it from the array (will modify original data) 
    output.push(data[key]); 
}  

output.sort(function(a,b) { 
    return(a.timestamp - b.timestamp); 
}); 

は(それは、アレイからアクセス可能ですので、私はオブジェクトへの元のキーを追加しました注意してください)出力としてこれを生成します

[{"timestamp":11111,"other":"xxx","key":"a"}, 
{"timestamp":22222,"other":"yyy","key":"b"}, 
{"timestamp":33333,"other":"zzz","key":"c"}] 

ここでは、次のように動作しています。http://jsfiddle.net/jfriend00/hXpkP/

+0

オブジェクトプロパティの* hasOwnProperty *テストを忘れたり、継承したプロパティを含めることができます。 – RobG

関連する問題