2010-03-19 1 views
1

У меня есть ArrayCollection, как указано ниже.Сомнение в скрипте действия для Flex: получение уникальных элементов из массива 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"} 

      ]); 

Я хочу, чтобы заполнить ComboBox с УНИКАЛЬНЫХ ЦЕННОСТЕЙ поля "APPNAME" от ArrayCollection initDG.

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

Один метод, который я мог думать, чтобы перебрать объекты массива и для каждого объекта проверки и нажмите уникальные записи APPNAME в другой массив. Есть ли лучшее решение?

ответ

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); 
+0

эй это отлично работает для меня! ура! – D3vtr0n

+0

Это должно быть выбрано в качестве ответа. Он отлично работает! спасибо – ggkmath

0

Увы, нет уникального метода() в массиве ActionScript, но вы можете приблизить его так:

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; 
    } 
); 

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

+0

Единственная проблема с тем, что анонимные функции приносят огромную стоимость: http://gskinner.com/talks/quick/#52, а 'array.indexOf' требует, чтобы вы каждый раз перебирали по массиву каждый вызов, который дорого. –

+0

Сколько элементов вы намерены иметь там? – lach

+0

Это отличная презентация, на которую вы ссылались. Очень интересно. Я не понимал, что анонимные вызовы функций намного дороже, чем прямые вызовы метода. Но результаты этой диаграммы для 100 000 вызовов. Этот кодовый блок требует 2 вызова для анонимной функции. Итак, если вы не собираетесь перебирать тысячи раз, чтобы заполнить свой поле со списком, я вряд ли думаю, что стоимость исполнения будет «огромной». Чтение кода более важно, чем спасение нескольких циклов, если не наблюдается заметных проблем с производительностью. – lach

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); 
     } 
    } 
}