簡體   English   中英

在Javascript中按值對哈希/數組進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM