Удаление дубликатов в Flex 4 XMLList с функцией фильтра - PullRequest
0 голосов
/ 23 мая 2011

Я видел множество примеров того, как удалять дубликаты в ArrayCollection, но я не могу перенести это в XMLList.В большинстве примеров ArrayCollection пример сравнивает ключ массива с методом hasOwnProperty и возвращает значение bool.Это хорошо, но что бы я сравнил при использовании XMLList?Допустим, у меня есть:

<fx:XML id="testXML" xmlns="">
   <universe>
      <category cname="cat 1">
         <item iname = "All"/>
         <item iname = "item 1"/>
         <item iname = "item 2"/>
      </category>
      <category cname="cat 2">
         <item iname = "All"/>
         <item iname = "item 3"/>
         <item iname = "item 4"/>
      </category>
   </universe>
</fx:XML>

[actionscript]

var myList:XMLList = testXML..@iname;

даст два вхождения предмета "ALL".Я знаю, что мне, возможно, придется преобразовать XMLList в XMLListCollection, чтобы использовать функцию filterFunction (как бы я это сделал - или мне просто определить myList как XMLListCollection с самого начала).затем в функцию filterFunction:

private function remove Duplicate (item:Object): Boolean
{
   here I don't know how to compare the item to tell me if the object already exist
   or not. I guess I need to compare the item to a copy of the list and see if the
   item has already been seen in the copy of the list. Or is there a clean way to
   do this?
}

, затем все это передается в dropDownList:

<s:DropDownList id="myDDL" dataProvider="{myList}" />

Ответы [ 2 ]

3 голосов
/ 23 мая 2011

Используя функцию фильтра E4x вы можете, например, поместить ключ в Object (если ключ является строкой, в противном случае использовать словарь вместо Object) и посмотреть, если он уже подарок для создания XMLList :

var xml:XML=<universe>
      <category cname="cat 1">
         <item iname="All"/>
         <item iname="item 1"/>
         <item iname="item 2"/>
      </category>
      <category cname="cat 2">
         <item iname="All"/>
         <item iname="item 3"/>
         <item iname="item 4"/>
      </category>
   </universe>

       function filter(xml:XML):XMLList {
        var seen:Object={}
        return xml..@iname.(!seen[valueOf()]&&(seen[valueOf()]=true))
       }

trace( filter(xml)  )

Вот живой пример на wonderfl: http://wonderfl.net/c/10xr

1 голос
/ 23 мая 2011

Самый простой способ, которым я знаю, как это сделать, это использовать ActionLinq . Этот код возьмет ваш код e4x и превратит его в Enumerable, приведёт атрибуты в виде строк, выделит элементы в списке и выведет их как ArrayCollection.

myList = Enumerable.from(testXML..@iname)
         .cast(String)
         .distinct()
         .toArrayCollection();

Если вы не хотите использовать ActionLinq, вы можете реализовать это, используя Dictionary:

[Bindable]
private var myList:ArrayList;

private function removeDuplicates(data:XMLList):ArrayList {
    var result:ArrayList = new ArrayList();
    var found:Dictionary = new Dictionary();

    for each(var item:String in data) {
        if(item in found) {
            continue;
        }

        found[item] = true;
        result.addItem(item);
    }

    return result;
}

А затем, когда XML готов, вы можете вызвать его:

myList = removeDuplicates(testXML..@iname);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...