按子对象属性排序对象

时间:2011-05-19 05:53:15

标签: javascript

我有一个对象的对象,我想根据属性进行排序......在我的头上缠绕时遇到一些麻烦:

sample = {
    "Elem1": { title: "Developer", age: 33 },
    "Elem2": { title: "Accountant", age: 24 },
    "Elem3": { title: "Manager", age: 53 },
    "Elem4": { title: "Intern", age: 18}
}

我的预期结果将是一个对象,其键现在已订购Elem4,Elem2,Elem1,Elem3。或者,我只需按顺序返回键,而不是物理地对对象进行排序。

这是否比它的价值更麻烦,或者我错过了一些明显的(或不那么明显的)JavaScript-Fu,它可以轻松地完成这样的工作?

谢谢!

3 个答案:

答案 0 :(得分:3)

对象的属性(键)本质上没有排序;如果你愿意,你必须保留自己的订购数组。

以下是一个示例,说明如何通过自定义排序函数简化任意属性对样本对象的排序:

var orderKeys = function(o, f) {
  var os=[], ks=[], i;
  for (i in o) {
    os.push([i, o[i]]);
  }
  os.sort(function(a,b){return f(a[1],b[1]);});
  for (i=0; i<os.length; i++) {
    ks.push(os[i][0]);
  }
  return ks;
};

orderKeys(sample, function(a, b) {
  return a.age - b.age;
}); // => ["Elem4", "Elem2", "Elem1", "Elem3"]

orderKeys(sample, function(a, b) {
  return a.title.localeCompare(b.title);
}); // => ["Elem2", "Elem1", "Elem4", "Elem3"]

根据需要对属性进行排序后,您可以迭代它们并按顺序检索相应的值。

答案 1 :(得分:2)

JavaScript中的Object没有属性订单;迭代时它们可以以任何顺序出现(尽管实际上它们通常按照它们的定义顺序出现)。

使用具有明确顺序的Arraysort()方法。

如果是Array,您可以使用...

sample.sort(function(a, b) {
    return a.age - b.age;
});

jsFiddle

答案 2 :(得分:0)

好吧,你不能对hashmap进行排序。 :)

但是,如果您有一个实际的数组,这是一个非常简单的排序。

var sample = [{title:'Developer', age:33}, ...  etc  ];

function ageSorter(a,b)
{
   return ((a.age) < (b.age)) ? 1 : -1;
}

sample.sort(ageSorter);