我有一个Objects(neObj)的ArrayCollection(neList)。每个neObj都有几个字段,如ipAddress,TID等。在大多数情况下neObj将具有TID和ipAddress的值,很少它不会有TID但有ipAddress ...添加对象(neObj)后,我需要排序ArrayCollection,其行为必须类似于array.sort(),它只有字符串..(即nos首先按字母顺序后跟字符串)
我尝试过的事情: 1)使用neList.source.sort()和neList.refresh ..但它不起作用,因为neList.source有对象不像字符串那样直接的东西 2)我认为我不能使用ArrayCollection的sortOn函数,因为它只能在1个字段上完成
我的要求: 使用案例1: - ArrayCollection中的对象同时具有TID和IP neObj1.TID =“RAPC”neObj1.ipAddress =“121.1.1.2”; neObj2.TID =“RAPA”neObj2.ipAddress =“121.1.1.1” 排序后的O / P应该是 neObj2 neObj1
使用案例2: - 其中一个对象没有TID neObj1.ipAddress = “121.1.1.2”; neObj2.TID =“RAPA”neObj2.ipAddress =“121.1.1.1” 排序后的O / P应该是 neObj1 neObj2
答案 0 :(得分:0)
正如评论中暗示的那样,您需要使用sort compareFunction来决定如何对项目进行排序。
我想指出,在默认情况下没有自然顺序的意义上,排序字母和数字的组合是棘手的。例如排序时,1,2和11,顺序将为1,11,2。但是,您可以使用naturalCompare项目中的AS3Commons Lang方法解决此问题。
这是您的案例的代码示例。排序是作为Sort类的子类实现的,因此您可以轻松地在其他集合中重用它:
package {
import mx.collections.Sort;
import org.as3commons.lang.StringUtils;
public class NaturalSort extends Sort {
public function NaturalSort() {
compareFunction = function (a:Object, b:Object, fields:Array = null):int {
var stringA:String = (("TID" in a) ? a.TID : "AAAA") + a.ipAddress;
var stringB:String = (("TID" in b) ? b.TID : "AAAA") + b.ipAddress;
return StringUtils.naturalCompare(stringA, stringB);
};
}
}
}
申请:
var collection:ArrayCollection;
collection.sort = new NaturalSort();
collection.refresh();