2012-11-13 321 views
1

我想排序数组。例如,给定数组a(下面),我想返回数组b。按对象属性对对象的一个​​javascript数组排序

我知道我可以做a.sort(),但是,我不想对实际的数组元素进行排序,而是对数组元素的属性(在本例中为s)进行排序。这如何实现?

谢谢

var a=[ 
    {s:"ced",o:{obj:1}}, 
    {s:"cde",o:{obj:2}}, 
    {s:"ade",o:{obj:3}}, 
    {s:"bde",o:{obj:4}} 
] 

var b=[ 
    {s:"ade",o:{obj:3}}, 
    {s:"bde",o:{obj:4}}, 
    {s:"cde",o:{obj:2}}, 
    {s:"ced",o:{obj:1}} 
] 
+0

重复:[点击这里](http://stackoverflow.com/questions/8900732/javascript-sort-objects- in-an-an-array-alphabet-on-one-property-of-the-arra)和[这里](http://stackoverflow.com/questions/8966247/sort-objects-by-a-property-values) – lbstr

回答

7

Array.prototype.sort接受一个可选参数:一个回调告诉它如何排序。

a.sort(function(x,y) { 
    // do something here 
    // return -1 if x < y 
    // return 1 if x > y 
    // otherwise, return 0 
}); 

所以,你的情况,这将是:

a.sort(function(x,y) {return x.s == y.s ? 0 : (x.s < y.s ? -1 : 1);}); 
+0

谢谢Kolink。什么是x和y?例如,x是当前项目,y是最高还是最低? – user1032531

+0

它们是数组中的两个元素,它们是由'sort'函数挑选出来的,用来确定它们进入的顺序。例如,如果输入数组是'[2,3,1]',那么它可能会问“什么为什么2和3进去?“......”2和1呢?“......在进入”好吧,我明白了,它是[1,2,3]'。“关键是你不需要知道*他们是哪些物品,所有你需要知道的是他们是两件物品,你被问及如何比较它们。 –

1

sort方法接受的compareFunction参数,在这里你可以定义如何计算排序顺序。
如您想比较字符串,此功能应使用localeCompare作为建议here
创建可以快速调整的排序功能的一种方法是通过另一个函数生成它。这意味着您可以为对象的任何属性自动创建排序函数。
将两个在一起,你会得到..

function genSortFn(prop){ 
    return function(a,b){ return a[prop].localeCompare(b[prop]); }; 
} 
a.sort(genSortFn('s')); 
b.sort(genSortFn('s')); 
+0

+1。''.localeCompare()' –

相关问题