[英]Sorting a Hash/Array by value in Javascript
我有以下代碼來生成一個簡單的哈希數組。
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
var arr = [];
for (i=0; i<10; i++) {
var id = 'user-' + Math.floor(getRandomArbitrary(0,1000));
var xp = Math.floor(getRandomArbitrary(2000,3000));
arr[id] = ({'xp':xp});
}
現在循環遍歷數組:
for (id in arr) {
document.write(id + ': ' + arr[id].xp + '<br>');
}
結果示例如下:
user-750: 2085
user-681: 2051
user-790: 2174
user-542: 2537
user-943: 2913
user-678: 2829
user-365: 2398
user-886: 2571
user-635: 2525
user-786: 2482
這將顯示所有用戶及其XP。
問題是,如何按XP(降序)對數組進行排序?
我開始於:
arr = arr.sort(function(a,b) {
return b.xp - a.xp;
});
但這不能很好地工作。
您無法對它進行排序,因為您沒有將數組用作數組。
數組也是一個對象,這就是為什么您可以使用"user-750"
類的鍵向其中添加項目的原因。 但是,這些項目是數組對象中的屬性,而不是數組中的項目。 當您對數組進行排序時,它將僅對項目進行排序,並且數組中沒有項目,因此排序不會發生任何變化。
您無法對屬性進行排序,因為屬性的順序是不確定的。 如果嘗試按特定順序添加屬性,則它們仍將按照順序返回,具體取決於它們在內部存儲的方式。 這是特定於實現的,並且不同的瀏覽器實際上將以不同的順序返回屬性。
如果要對數組進行排序,則必須將對象作為數組中的項而不是作為屬性添加:
arr.push({ id: id, xp: xp });
您的“數組”不是數組,而是對象:
{
'user-750': {xp: 2085}
'user-681': {xp: 2051}
...
}
如果要排序,則需要一個對象數組:
[
{id: 'user-750', xp: 2085},
{id: 'user-681', xp: 2051},
...
]
該對象數組應該是可排序的。
這是我用於排序的家庭釀造排序器方法(在此jsFiddle中演示):
function sorter(sortOn,descending) {
sortOn = sortOn && sortOn.constructor === Object ? sortOn : {};
return function ( a, b ) {
if (sortOn.string || sortOn.numeric || sortOn.key) {
a = sortOn.key ? a[sortOn.key] : a;
a = sortOn.string ? String(a) : sortOn.numeric ? +a : a;
b = sortOn.key ? b[sortOn.key] : b;
b = sortOn.string ? String(b) : sortOn.numeric ? +b : b;
if (sortOn.key && (!b || !a)) { //empty values on top
return !a && !b ? 1 : !a ? 1 : -1;
}
}
return descending
? (a < b ? 1 : a > b ? -1 : 0)
: (a < b ? -1 : a > b ? 1 : 0);
};
}
// usage
arr = arr.sort( sorter({key: 'xp', numeric: 1}, true) );
我認為您必須設定優先級。
1)如果要對記錄進行排序,則可以使用數組。 但是要查找特定的密鑰,您必須先通過密鑰。
2)如果要按鍵獲取記錄,可以為此使用對象/哈希,但是無法對記錄進行排序,hash中沒有特定的順序 。
如果要使用數組和排序,我認為在將內容推送到數組時應該稍微更改實現。
像波紋管
arr.push({ id: id, xp: xp });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.