Actionscript 3:根据另一个数组集合层次结构重新排序数组集合

时间:2011-09-16 14:32:56

标签: flex actionscript-3 actionscript arraycollection

我有一个数组,crewPositionsAC,其中包含位置异化列表 - EP,PR,DR,WR等。每次我的flex应用程序加载时,都会通过XML文件读入这些位置。从XML填充也是一个项目。在一个项目中,有一些职位(一名学生被分配到crewPositionsAC中列出的一种职位)。这些位置不一定是由crewPositionsAC规定的正确层次结构顺序。我拥有ArrayCollection(positionsAC)中的所有位置,具有以下结构:

positionsAC (arrayCollection)
    [0] = Array
        [0] = startOffset
        [1] = numDays
        [2] = role
        [3] = studentID
        [4] = conflict
        [5] = studentType
        [6] = showInPrinciple
        [7] = revisionNumber
    *continue until all positions are listed*

我的问题是,如何重新排序positionAC以确保每个数组的“角色”部分的顺序正确(由crewPositionsAC指定)?我尝试了几个不同的循环,但没有任何东西接近。

修改

所以,有几个项目,每个项目中有几个职位(通常是16或17,但没有固定数字。

在项目中,有一个名为positionsAC的变量具有以下结构:

positionsAC:
    [0] (array)
        [0] = startOffset
        [1] = numDays
        [2] = role
        [3] = studentID
        [4] = conflict
        [5] = studentType
        [6] = showInPrinciple
        [7] = revisionNumber
    *continue until all positions are listed*

然后,用户可以单击按钮添加其他位置。按下“添加船员”按钮后,将向用户显示要添加的可能位置列表。目前,我只是向positionsAC添加另一个数组。这导致最近添加的机组成员被放置在列表的底部。我需要根据crewPositionsAC中定义的层次结构,根据它的[2]项(角色)对positionAC进行重新排序。 crewPositionsAC具有以下结构:

crewPositionsAC:
    [0] = EP
    [1] = PR
    [2] = DR
    [3] = WR
    * continue until all possible position types are listed

希望有所帮助。

2 个答案:

答案 0 :(得分:1)

尝试这些循环:

for (var i:int = 0; i < crewPositionsAC.length; i++)
{
    var sourcePosition:Object = crewPositionsAC.getItemAt(i);
    var actualPosition:Object = findActualPositionByRole(sourcePosition);
    positionsAC.setItemAt(actualPosition, i);
}

function findActualPositionByRole(sourcePosition):Object
{
    for (var i:int = 0; i < positionsAC.length; i++)
    {
        var currentPosition:Object = positionsAC.getItemAt(i);
        if (currentPosition[2] == sourcePosition[2])
            return currentPosition;
    }

    throw new Error("There's no matching item with the specified role");
}

上述代码应该在@Tim尝试验证的假设下工作。

答案 1 :(得分:0)

使用以下内容作为实现目标的基础:

for (var i:int = 0; i < parentDocument.crewPositionsAC.length; i++)
{
    for (var j:int = 0; j < positionsAC.length; j++)
    {
        if (positionsAC[j][2] == parentDocument.crewPositionsAC.getItemAt(i))
            tempAC.addItem(positionsAC[j] as Array);
    }
}

从那里,我可以使用tempAC来到达我需要去的地方...谢谢你,我得到了我需要的地方=)