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

Apache flex Actionscript 3:基于另一个数组集合层次结构对数组集合重新排序,apache-flex,actionscript-3,actionscript,arraycollection,Apache Flex,Actionscript 3,Actionscript,Arraycollection,我有一个数组crewPositionsAC,它包含一个位置删减列表—EP、PR、DR、WR等等。每次加载flex应用程序时,都会通过XML文件读入这些位置。从XML填充的还有一个项目。在一个项目中,有职位(分配给crewPositionsAC中列出的职位类型的学生)。这些职位不一定按照crewPositionsAC规定的正确层次顺序排列。我拥有以下结构的ArrayCollection(positionsAC)中的所有位置: positionsAC (arrayCollection) [0

我有一个数组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:
    [0] (array)
        [0] = startOffset
        [1] = numDays
        [2] = role
        [3] = studentID
        [4] = conflict
        [5] = studentType
        [6] = showInPrinciple
        [7] = revisionNumber
    *continue until all positions are listed*
crewPositionsAC:
    [0] = EP
    [1] = PR
    [2] = DR
    [3] = WR
    * continue until all possible position types are listed
我的问题是,我如何重新排序positionsAC以确保每个数组的“角色”片段的顺序正确(由crewPositionsAC指定)?我尝试了几个不同的for循环,但都没有成功

编辑

因此,有几个项目,每个项目中有几个职位(通常16或17个,但没有固定的编号)

在项目中,有一个名为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:
    [0] (array)
        [0] = startOffset
        [1] = numDays
        [2] = role
        [3] = studentID
        [4] = conflict
        [5] = studentType
        [6] = showInPrinciple
        [7] = revisionNumber
    *continue until all positions are listed*
crewPositionsAC:
    [0] = EP
    [1] = PR
    [2] = DR
    [3] = WR
    * continue until all possible position types are listed
然后,用户可以单击按钮添加另一个职位。当“添加工作人员”按钮按下按钮,用户将看到一个可能要添加的位置列表。目前,我只需向positionsAC添加另一个数组。这将导致最近添加的机组成员被放置在列表底部。我需要获取positionsAC并根据其[2]项(角色)对其重新排序基于crewPositionsAC中定义的层次结构。crewPositionsAC具有以下结构:

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:
    [0] (array)
        [0] = startOffset
        [1] = numDays
        [2] = role
        [3] = studentID
        [4] = conflict
        [5] = studentType
        [6] = showInPrinciple
        [7] = revisionNumber
    *continue until all positions are listed*
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");
}
for(变量i:int=0;i
上述代码应在@Tim尝试验证的假设下工作。

尝试以下循环:

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");
}
for(变量i:int=0;i

上面的代码应该在@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);
    }
}
for(变量i:int=0;i

从那时起,我可以使用tempAC去我需要去的地方…谢谢vlad,你让我去了我需要去的地方=)

最后使用以下作为实现我目标的基础:

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);
    }
}
for(变量i:int=0;i

从那里,我可以用坦帕克去我需要去的地方。。。谢谢vlad,你把我带到了我需要去的地方=)

我收到了一个错误,原因是以下代码行:“positionsAC.setItemAt(crewPositionsAC[item],I);”@Brds抱歉,我不小心按下了保存按钮。我已经编辑了post.Error“在字符串上找不到属性2,并且没有默认值。”来自带有“if(currentPosition[2]==sourcePosition[2])的行,它应该是“sourcePosition”。。。不是“源位置[2]”。。。现在进行测试时,我得到一个由以下代码行引起的错误:“positionsAC.setItemAt(crewPositionsAC[item],i);”@Brds抱歉,我不小心按下了保存按钮。我已经编辑了post.Error“在字符串上找不到属性2,并且没有默认值。”来自带有“if(currentPosition[2]==sourcePosition[2])的行,它应该是“sourcePosition”。。。不是“源位置[2]”。。。现在测试一下你是说学生被分配了一个职位缩写(例如EP或PR或WR或…),每个职位只有一个学生,并且职位缩写出现的顺序是你希望学生呈现的顺序吗?因此,例如,如果缩写词WR在您的缩写词列表中是第一位的,那么position=WR的学生将在您的学生列表中是第一位的?是的,这正是我所说的。=)我在原来的帖子中添加了更多的信息,以帮助把事情弄清楚。你是说学生被分配了一个职位缩写(例如EP或PR或WR或…),每个职位只有一个学生,而职位缩写的出现顺序是你想给学生的顺序吗?因此,例如,如果缩写词WR在您的缩写词列表中是第一位的,那么position=WR的学生将在您的学生列表中是第一位的?是的,这正是我所说的。=)我在原来的帖子中添加了更多的信息,让事情变得更清楚。