在Javascript中按值对哈希/数组排序

在Javascript中按值对哈希/数组排序,javascript,arrays,sorting,hash,Javascript,Arrays,Sorting,Hash,我有以下代码来生成一个简单的哈希数组 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(getRandomArbitra

我有以下代码来生成一个简单的哈希数组

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});
}
这将显示所有用户及其XP

问题是,如何按XP(降序)对该数组进行排序

我从以下几点开始:

arr = arr.sort(function(a,b) {
    return b.xp - a.xp;
});

但是这样做不好。

您无法对其进行排序,因为您没有将该数组用作数组

数组也是一个对象,这就是为什么您可以使用像
“user-750”
这样的键向其添加项。但是,这些项是数组对象中的属性,而不是数组中的项。对数组进行排序时,它只对项目进行排序,而数组中没有项目,因此排序不会改变任何内容

无法对属性进行排序,因为属性的顺序未定义。如果您尝试按特定顺序添加属性,它们仍将按顺序返回,具体顺序取决于它们在内部的存储方式。这是特定于实现的,不同的浏览器实际上会以不同的顺序返回属性

如果要对数组进行排序,必须将对象添加为数组中的项,而不是属性:

arr.push({ id: id, xp: 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},
  ...
]
该对象数组应该是可排序的

以下是我用于排序的自制分拣机方法(在中演示):

功能分拣机(分拣机,下降){
sortOn=sortOn&&sortOn.constructor==Object?sortOn:{};
返回函数(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?字符串(b):sortOn.numeric?+b:b;
if(sortOn.key&(!b | | |!a)){//顶部为空值
return!a&!b?1:!a?1:-1;
}
}
返回下降
?(ab?-1:0)
:(ab-1:0);
};
}
//用法
arr=arr.sort(sorter({key:'xp',numeric:1},true));

您的“数组”不是数组,而是对象:

{ 
  'user-750': {xp: 2085}
  'user-681': {xp: 2051}
  ...
}
如果要排序,需要一个对象数组:

[
 {id: 'user-750', xp: 2085},
 {id: 'user-681', xp: 2051},
  ...
]
该对象数组应该是可排序的

以下是我用于排序的自制分拣机方法(在中演示):

功能分拣机(分拣机,下降){
sortOn=sortOn&&sortOn.constructor==Object?sortOn:{};
返回函数(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?字符串(b):sortOn.numeric?+b:b;
if(sortOn.key&(!b | | |!a)){//顶部为空值
return!a&!b?1:!a?1:-1;
}
}
返回下降
?(ab?-1:0)
:(ab-1:0);
};
}
//用法
arr=arr.sort(sorter({key:'xp',numeric:1},true));

我认为您必须设置优先级

1)如果要对记录进行排序,可以使用数组。但要寻找一个特定的钥匙,你必须通过钥匙

2)如果要按键获取记录,可以使用对象/哈希,但不能对记录进行排序,哈希中没有特定顺序

如果您打算使用数组和排序,我认为您应该在数组中推进内容时稍微更改一下实现

像吼叫

arr.push({ id: id, xp: xp });

我认为你必须确定你的优先权

1)如果要对记录进行排序,可以使用数组。但要寻找一个特定的钥匙,你必须通过钥匙

2)如果要按键获取记录,可以使用对象/哈希,但不能对记录进行排序,哈希中没有特定顺序

如果您打算使用数组和排序,我认为您应该在数组中推进内容时稍微更改一下实现

像吼叫

arr.push({ id: id, xp: xp });

为什么它工作不“好”?它没有按XP排序。
arr
不是数组,而是对象。数组有数字键,
。sort
只对这些元素进行操作。为什么它不能“很好”工作?它没有按XP排序。
arr
不是数组,而是对象。数组有数字键,
。sort
只对这些元素进行操作。这是我以前做的,但是如果我想在XP中查找特定的ID,我会在数组中循环吗?@P.Henderson:是的,你不能同时拥有这两个元素,除非你实际上两者都拥有。你可以有一个用于顺序的数组和一个用于查找的对象。这是我以前做的,但是如果我想查找XP中的特定ID,我是否必须循环遍历该数组呢?@P.Henderson:是的,你不能同时拥有这两个数组,除非你实际上两者都拥有。您可以有一个用于顺序的数组和一个用于查找的对象。