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



我有一个数组,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*

我的问题是这样的,我怎么能重新排序positionsAC,以确保每个数组的"角色"块是在正确的顺序(由crewPositionsAC规定)?我试过几个不同的for循环,但没有一个接近。

编辑

所以,有几个项目,在每个项目中有几个位置(通常是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*

然后,用户可以点击按钮来添加另一个位置。当"Add Crew Member"按钮被按下时,用户会看到一个可能要添加的位置列表。目前,我只是在positionsAC中添加另一个数组。这将导致最近添加的机组成员被放置在列表的底部。我需要采取positionsAC并根据它的[2]项目(角色)重新排序它基于在crewPositionsAC中定义的层次结构。crewPositionsAC的结构如下:

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

希望对大家有所帮助。

试试这些循环:

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尝试验证的假设下工作。

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

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到达我需要去的地方…谢谢vlad,你把我带到我需要的地方=)

最新更新