繁体   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