我的目标是:
[ '4e95b308d36f429729000021': 1,
'4e95b309d36f429729000039': 2,
'4e95b308d36f429729000001': 1 ]
我想排序,以便2
有价值的键是第一个。我知道这个问题之前已被问过一百万次,但这不起作用:
var descSort;
descSort = function(a, b) {
return b.value - a.value;
};
popularLocationsArray.sort(descSort);
答案 0 :(得分:3)
首先,您的代码不是有效的JavaScript,应该是:
var popularLocationsArray = [
{'4e95b308d36f429729000021': 1},
{'4e95b309d36f429729000039': 2},
{'4e95b308d36f429729000001': 1}
]
知道您的问题是您不知道每个对象中的密钥名称,并且您希望按此密钥的值进行排序。首先,您需要定义辅助函数:
function anyVal(obj) {
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
return obj[key]
}
}
}
现在排序很简单:
popularLocationsArray.sort(function(a,b) {return anyVal(a) - anyVal(b)});
答案 1 :(得分:0)
您无法对对象进行排序。对象没有理由以任何特定顺序返回它的密钥。
现在,如果你有这样的意思,你可以选择:
function descSort(a, b) {
var value1 = +a[Object.keys(a)[0]],
value2 = +b[Object.keys(b)[0]];
return value2 - value1;
}
[ {'4e95b308d36f429729000021': 1},
{'4e95b309d36f429729000039': 2},
{'4e95b308d36f429729000001': 1} ].sort(descSort)
这使用Object.keys,它没有本机
答案 2 :(得分:0)
为了让生活变得有趣,您可以通过创建自己的自定义对象来使数组中的对象可排序(即在包含的数组中):
function Foo(key, value) {
this[key] = value;
}
Foo.prototype.toString = function() {
for (var p in this) {
if (this.hasOwnProperty(p)) {
return this[p];
}
}
}
var a = new Foo('4e95b308d36f429729000021', 1);
var b = new Foo('4e95b309d36f429729000039', 2);
var c = new Foo('4e95b308d36f429729000001', 1);
var popularLocationsArray = [a, b, c];
alert(popularLocationsArray); // 1, 2, 1
alert(popularLocationsArray.sort()); //1, 1, 2
或者您可以对密钥名称进行排序,或者将密钥和属性组合起来,无论如何。只需让 toString 方法返回您希望它们排序的任何内容。