1

我有一个 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中的“appName”字段的唯一值填充一个组合框。

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

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

4

3 回答 3

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);
于 2010-03-19T05:44:18.880 回答
1

您可以使用此类来查找唯一的数组集合:

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);
        }
    }
}
于 2010-08-13T07:02:04.703 回答
0

唉,在 ActionScript 的 Array 中没有 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;
    }
);

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

于 2010-03-19T07:25:06.930 回答