Flex的动作脚本疑问:从ArrayCollection中获取唯一元素

时间:2010-03-19 05:27:04

标签: flex arraycollection unique-values

我有一个如下所述的ArrayCollection。

        private var initDG:ArrayCollection = new ArrayCollection([
            {fact: "Order #2314", appName: "AA"},

            {fact: "Order #2315", appName: "BB"}

            {fact: "Order #2316", appName: "BB"}
                            ...

            {fact: "Order #2320", appName: "CC"}

            {fact: "Order #2321", appName: "CC"}

            ]);

我想在ArrayCollection initDG 中使用 UNIQUE VALUES 的“appName”字段填充ComboBox。

<mx:ComboBox id="appCombo" dataProvider="{initDG}" labelField="appName"/>

我能想到的一种方法是遍历Array对象,并为每个对象检查并将唯一的appName条目推送到另一个Array中。有没有更好的解决方案?

3 个答案:

答案 0 :(得分:3)

这对我来说听起来不错:

var unique:Object = {};
var value:String;
var array:Array = initDG.toArray();
var result:Array = [];
var i:int = 0;
var n:int = array.length;
for (i; i < n; i++)
{
 value = array[i].appName;
 if (!unique[value])
 {
  unique[value] = true;
  result.push(value);
 }

}
return new ArrayCollection(result);

答案 1 :(得分:1)

您可以使用此类查找唯一的arraycollection:

tempArray=_uniqueArray.applyUnqiueKey1(_normalsearchdata.toArray());

“uniqueArray”这是包名,_normalsearchdata是ArrayCollection;

package{
    import mx.collections.ArrayCollection;
    public class applyUniqueKey{
        private var tempArray:Array;

        private var tempIndex = 0;
        public var temp:String;
        public function applyUnqiueKey1(myArray)

        {
            tempArray = new Array();
            tempIndex = 0;  
            myArray.sort();
            tempArray[0] = myArray[0];
            tempIndex++;

            for(var i=1; i<myArray.length; i++) {
                if(myArray[i] != myArray[i-1]) {
                    tempArray[tempIndex] = myArray[i];
                    tempIndex++;
                }
            }
            var temp=String(tempArray.join());
            return new ArrayCollection(tempArray);
        }
    }
}

答案 2 :(得分:0)

唉,ActionScript的数组中没有unique()方法,但你可以像这样对它进行近似:

var names:Array = initDG.toArray().map(
    function (e:Object, i:Number, a:Array):String {
        return e.appName;
    }
);

var uniqueNames:Array = names.filter(
    function (name:String, i:Number, a:Array):Boolean {
                // Only returns true for the first instance.
        return names.indexOf(name) == i;
    }
);

请注意,这恰好起作用,因为您正在过滤字符串,这些字符串按值进行比较。如果您需要过滤任意对象,这将无效。