2011-09-14 128 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

您可以創建索引,鍵值和「順序」的哈希表,並在需要時使用從一個數組到對象的引用 – Miguel

2

你不處理數組,但隨着ab屬性值的對象,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]]等)。這假定時間戳是數字的。如果他們是Date對象的排序應該是:

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 *測試,或者您可能會包含inhertied屬性。 – RobG