Slice XMLList вместо Array - PullRequest
       29

Slice XMLList вместо Array

1 голос
/ 03 февраля 2011

Как я могу получить диапазон элементов из моего xmllist, аналогичный методу slice для массива?

slice (startIndex, endIndex);

Я пытаюсь что-то вроде этого:

            var tempXMLList:XMLList = new XMLList();

            for( var i:int = startIndex; i <= endIndex; i++){
                tempXMLList += originalList[i];
            }

Но я получаю сообщение об ошибке, что он не может конвертировать originalList [i]

--- Обновление ---

Я использовал функцию Тимофея, и она работалаотлично.

private function SliceXMLList(xmllist : XMLList, startIndex : int, endIndex : int) : XMLList
{
    return xmllist.(childIndex() >= startIndex && childIndex() <= endIndex);
}

Однако, когда я использую xmllist, который уже был отфильтрован, он ломается.

filteredData = filteredData.(team == "Ari");

trace("filteredData.length(): " + filteredData.length().toString());
pData = SliceXMLList(filteredData, startIndex, endIndex);
trace("start: " + startIndex.toString() + " end: " + endIndex.toString());
trace("pdata length: " + pData.length().toString());

output

filteredData.length(): 55
start: 0 end: 55
pdata length: 5

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011

Используйте e4x.

private function SliceXMLList(xmllist : XMLList, startIndex : int, endIndex : int) : XMLList
{
    return xmllist.(childIndex() >= startIndex && childIndex() <= endIndex);
}

Обновление:

Существует проблема, если вы собираетесь использовать эту функцию после некоторой сортировки e4x, потому что функция childIndex () возвращает старые значения индексов узлов, и ее нельзя изменить. Итак, у меня есть другая идея:

private function SliceXMLList(xmllist : XMLList, startIndex : int, endIndex : int) : XMLList
{
    for (var i : int = 0; i < xmllist.length(); i++)
        xmllist[i].@realIndex = i;
    xmllist =  xmllist.(@realIndex >= startIndex && @realIndex <= endIndex);
    for (i = 0; i < xmllist.length(); i++)
        delete xmllist[i].@realIndex;
    return xmllist;
}

или просто

private function SliceXMLList(xmllist : XMLList, startIndex : int, endIndex : int) : XMLList
{
    var newXMLList : XMLList = new XMLList();
    var currIndex : int = 0;
    for (var i : int = startIndex; i <= endIndex; i++)
        newXMLList[currIndex++] = xmllist[i];
    return newXMLList;
}

Это лучший вариант, я думаю. Конечно, однострочный оператор e4x гораздо элегантнее, но, к сожалению, его нельзя использовать повторно.

0 голосов
/ 03 февраля 2011

не уверен, как вы ожидаете, что это будет работать, но вы можете перебрать все дочерние элементы, сохранить каждого в массив и затем обрезать их таким образом

...