我正在尝试编写一个与Array.sort()一起使用的sort函数。我有点不知道如何写出我需要的东西。
在我的应用程序项目中,在整个执行过程中的不同时间将项目添加到此数组中,每次添加项目时,都会对数组进行排序。 Array中的项目都是对象,并且都具有属性“weight”。如果重量较大,则该项目应该先行,如果该项目应该更少。这很简单,我有一个看起来像这样的功能:
return a.weight - b.weight;
问题是我有一个额外的要求,即如果稍后添加一个项目并且它与另一个项目具有相同的权重,则它必须放在该数组中的该项目之后。它必须落后于已经添加的具有相同权重的数组中的每个项目。
我无法想出能够确保每次都满足要求的功能。
感谢您的帮助!
答案 0 :(得分:5)
不需要编写自定义排序,数组的sortOn
可以处理这种情况。
但是,您需要在商品中添加新会员,我将其称为“时间戳”。
arr.sortOn( [ 'weight', 'timestamp' ], [ Array.NUMERIC | Array.DESCENDING, Array.NUMERIC ] );
第一个参数定义将用于排序的属性,第二个参数定义每个字段的选项。有关详细信息,请参阅http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#sortOn()。 | -operator(按位OR运算符)用于为一个字段传递多个选项。 因此,在这种情况下,第一个字段('weight')按数字顺序排序。
- 编辑:
对于向量,您需要使用比较函数:
var sortFunc : Function = function (x: <T>, y : <T>):Number{
var dw:Number = y.weight - x.weight
if( dw ==0 ){
//returns negative if y was added later
return x.timestamp - y.timestamp;
}else{
//returns negative if x has a higher weight
return dw;
}
}
vec.sort( sortFunc );
答案 1 :(得分:1)
我建议在对象中添加另一个属性。类似的东西:
a.index = i; // where, i is the index before sorting
这将允许您在排序之前跟踪它进入列表的顺序。
除此之外,您还可以考虑保留数组本身的另一个副本(索引完整)。