我有一个数组,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,你把我带到我需要的地方=)