1

我正在尝试对数组进行排序。例如,给定数组 a(如下),我想返回数组 b。

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

谢谢

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}}
]
4

3 回答 3

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);});
于 2012-11-13T19:35:22.240 回答
1

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

function genSortFn(prop){
    return function(a,b){ return a[prop].localeCompare( b[prop] ); };
}
a.sort( genSortFn('s') );
b.sort( genSortFn('s') );
于 2012-11-13T19:37:12.390 回答
1
a.sort(function(a, b){
    if(a.s < b.s){
        return -1;
    }
    if(a.s > b.s){
        return 1;
    }
    return 0;
});

http://jsfiddle.net/lbstr/nCKpG/

于 2012-11-13T19:37:31.637 回答