按对象属性对 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 对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章