我有一个对象的对象,我想根据属性进行排序......在我的头上缠绕时遇到一些麻烦:
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,它可以轻松地完成这样的工作?
谢谢!
答案 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
没有属性订单;迭代时它们可以以任何顺序出现(尽管实际上它们通常按照它们的定义顺序出现)。
使用具有明确顺序的Array
和sort()
方法。
如果是Array
,您可以使用...
sample.sort(function(a, b) {
return a.age - b.age;
});
答案 2 :(得分:0)
好吧,你不能对hashmap进行排序。 :)
但是,如果您有一个实际的数组,这是一个非常简单的排序。
var sample = [{title:'Developer', age:33}, ... etc ];
function ageSorter(a,b)
{
return ((a.age) < (b.age)) ? 1 : -1;
}
sample.sort(ageSorter);