如何根据值对JavaScript中的对象进行排序?

时间:2011-10-12 21:05:36

标签: javascript sorting

我的目标是:

[ '4e95b308d36f429729000021': 1,
  '4e95b309d36f429729000039': 2,
  '4e95b308d36f429729000001': 1 ]

我想排序,以便2有价值的键是第一个。我知道这个问题之前已被问过一百万次,但这不起作用:

var descSort;
descSort = function(a, b) {
  return b.value - a.value;
};
popularLocationsArray.sort(descSort);

3 个答案:

答案 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 方法返回您希望它们排序的任何内容。