按对象属性对 javascript 对象数组进行排序

Posted

技术标签:

【中文标题】按对象属性对 javascript 对象数组进行排序【英文标题】:Sort a javascript array of objects by object property 【发布时间】:2012-11-02 06:39:02 【问题描述】:

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

我知道我可以做到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
]

【问题讨论】:

重复:here 和 here 【参考方案1】:

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););

【讨论】:

感谢 Kolink。 x 和 y 是什么?例如,x 是当前项目,y 是最高还是最低? 它们是数组中的两个项目,由sort 函数选取,以尝试计算它们进入的顺序。例如,如果输入数组是[2,3,1],那么它可能会询问“ 2 和 3 的顺序是什么?”...“那么 2 和 1 呢?”...在“好的,我知道了,它是 [1,2,3]”之前。关键是你不需要知道它们是哪些项,你只需要知道它们是两个项目,并且系统会询问你如何比较它们。【参考方案2】:
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/

【讨论】:

【参考方案3】:

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') );

【讨论】:

以上是关于按对象属性对 javascript 对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

javascript 按对象属性对对象数组进行排序

Javascript - 如何按 3 种不同的属性类型对对象数组进行排序? (字符串、整数、布尔值)

对JavaScript对象数组按指定属性和排序方向进行排序

按字符串属性值对对象数组进行排序

JavaScript实现对象数组按不同字段排序

JS对象数组多条件排序