4

私の 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
    ]
}

次に、これらの値に基づいてオブジェクトのインデックスを再作成すると、オブジェクトにインデックスを付ける方法が整理されますが、新しい要素を挿入すると、_インデックスの関係も再生成する必要があり、非常に手間がかかります。

4

5 に答える 5

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/

于 2011-09-14T01:43:55.000 に答える
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 [keys [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));
});

したがって、シナリオで最も意味のあるものを使用してください。

于 2011-09-14T01:09:43.613 に答える
2

Javascript オブジェクトは連想配列ではありません。それらは同様に動作する場合がありますが、同じではありません。Javascript には連想配列がありません。

連想配列には順序の概念がありますが、Javascript オブジェクトはこの特定の機能を単純に共有していません。オブジェクトは、その性質上、順序付けされていません。

だから、あなたの質問に答えるために:あなたはそれらを注文することはできません...

于 2011-09-14T00:50:51.863 に答える
2

配列ではなく、ab、およびのプロパティ値を持つオブジェクトを扱っています。c

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

配列を操作している場合sort、これは( を使用して)簡単です...

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

array.sort(function(a,b) {
    return a.timestamp - b.timestamp;
});
于 2011-09-14T00:52:42.227 に答える
0

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

于 2011-09-14T01:22:39.177 に答える