Сценарий сомнения в действии для Flex: получение уникальных элементов из ArrayCollection - PullRequest
1 голос
/ 19 марта 2010

У меня есть 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"}

            ]);

Я хочу заполнить поле со списком УНИКАЛЬНЫЕ ЗНАЧЕНИЯ поля "appName" из ArrayCollection initDG .

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

Один из способов, который я мог бы придумать, - это циклически проходить по объектам Array и для каждого объекта проверять и помещать уникальные записи appName в другой Array. Есть ли лучшее решение?

Ответы [ 3 ]

3 голосов
/ 19 марта 2010

Это звучит хорошо для меня:

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 голос
/ 13 августа 2010

Вы можете использовать этот класс для поиска уникальной коллекции массива:

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);
        }
    }
}
0 голосов
/ 19 марта 2010

Увы, в массиве 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;
    }
);

Обратите внимание, что это работает, потому что вы фильтруете строки, которые сравниваются по значению. Это не будет эффективно, если вам нужно отфильтровать произвольные объекты.

...