2011-02-01 18 views
12

私は時間によってソートされたマップオブジェクト内にいくつかのjsonデータを持っています。キーは整数のIDで、値はタイムスタンプを含むオブジェクトです。しかし、jQuery $ .each関数を使ってこのデータを繰り返し処理しようとすると、結果はキーでソートされて戻ってきます。オブジェクトのコレクションを元の順序で繰り返し処理するにはどうすればよいですか?jQuery JSONオブジェクトを元の順序で繰り返します。

コード例:

$.getJSON(url, addPages); 
function addPages(pageData) { 
    $.each(pageData, function(key,value){ 
     alert(key+' : '+value); 
    } 
} 

答えて

6

は、あなたがオブジェクトの配列にキーと値のペアをコピーすることができます:あなたは非数値キーと特定の順序の両方で何かを必要とする場合、最も簡単な方法は、[キー、値]リストのリストを使用しただろうArray.sortを使用して順序を入れます。

// $.getJSON(url, addPages); //removed for test purposes 
function addPages(pageData) { 
    var pageItems = []; 
    $.each(pageData, function(key,value){ 
     pageItems.push({ key: key, value: value }); 
    }); 
    // Assuming you can do arithmetic on timestamps 
    pageItems.sort(function(a,b){ return a.value.timeStamp - b.value.timeStamp; }); 
    $.each(pageItems, function(index,pageItem){ 
     alert(pageItem.key+' : '+pageItem.value.timeStamp); 
    }); 
} 

私のテストスクリプト:ここ

var testData = { 
    '12': { timeStamp: 55 }, 
    '16': { timeStamp: 655 }, 
    '123': { timeStamp: 455 }, 
    '312': { timeStamp: 955 }, 
    '132': { timeStamp: 255 }, 
    '126': { timeStamp: 455 }, 
    '162': { timeStamp: 355 } 
    }; 
addPages(testData); 
+0

実際にあなたが投稿したもののようになりましたが、あなたのスニペットは構文エラーbtwでいっぱいです。 – Doug

+0

構文エラーについては申し訳ありません。今修正しました。 (私は最近の夜とRubyへの最近の暴露を非難しています) –

11

オブジェクトは非順序セットです。ブラウザ間の不平等なやり方で注文を指定することはできません。それが既にルールによって注文されていない限り、元の注文の概念はありません。

したがって、サーバー上のデータをソートし、同じソート順で列挙します。

別の方法としては、for (i = 0; i < len; i++)ループと「garantuee」元の順序で配列を反復することができる

{ "values": [ 
    { "someKey": "someVal" }, 
    { "someOtherKey": "someOtherVal" } 
] } 

ことがJSONをフォーマットします。

0

オブジェクトのタイムスタンプを「オリジナル」とすると、アレイを明示的に並べ替える以外の方法はないと思います。

2

firefoxオブジェクトでは、chromeでは順序を保持しています。他のブラウザについては考えていませんが、2つの異なる実装が既にあなたがそれに頼ることができないことを示しています。

何か注文が必要な場合は、リストを使用してください。

[['abd', 'def'], ['ghi', 'jkl']] 
+0

は、Chromeで問題に関してのリンクです:http://code.google.com/p/v8/issues/detail?id=164 –

+0

どれでも{k:v}オブジェクトよりも[k、v]タプルを好む理由は? – Raynos

+0

@FelixKing実装ではそれほど大きな問題ではありません。すべて有効ですが、一貫していません。 – Raynos

関連する問題