【问题标题】:Slice XMLList instead of Array切片 XMLList 而不是 Array
【发布时间】:2011-02-02 22:00:39
【问题描述】:

如何从我的 xmllist 中获取一系列项目,类似于数组的 slice 方法?

slice(startIndex,endIndex);

我正在尝试这样的事情:

            var tempXMLList:XMLList = new XMLList();

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

但我收到一个错误,它无法转换 originalList[i]

--- 更新---

我用了Timofei的功能,效果很好。

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

输出

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

【问题讨论】:

    标签: arrays apache-flex actionscript-3 slice xmllist


    【解决方案1】:

    使用 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 语句要优雅得多,但不幸的是它不可重用。

    【讨论】:

    • 实际上,当我的原始 xmllist 来自另一个被过滤的列表时,我得到了奇怪的结果。我想也许索引没有更新?
    • 你能显示整个代码吗? filderedData 是一个 XMLList,就是切片的结果,对吗?
    • 你说得对,问题在于 childIndex(),因为它们不会改变。让我想想,我们能做些什么……
    • 把它分配给一个新的xmllist怎么样? filtersData = new XMLList(filteredData);
    • 那行不通。某种创建新子索引的副本?或者,也许您的函数可以使用 childindex 以外的其他内容。感谢您迄今为止的帮助。
    【解决方案2】:

    不确定你期望它如何工作,但你可以遍历所有子元素,并将每个子元素保存到一个数组中,然后以这种方式修剪它们

    【讨论】:

    • 谢谢。什么是正确的语法?我在上面添加了代码。
    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2019-01-31
    • 2017-06-01
    相关资源
    最近更新 更多