E4X可以通过阵列吗?

时间:2009-09-29 11:20:46

标签: arrays match e4x

假设我们有以下XML:

<people>
 <person>
  <name>Jake</name>
  <skills>
   <skill>JavaScript</skill>
   <skill>HTML</skill>
   <skill>Flex</skill>
   <skill>CSS</skill>
  </skills>
 </person>
 <person>
   <name>John</name>
   <skills>
    <skill>C++</skill>
    <skill>Foxpro</skill>
   </skills>
 </person>
 <person>
  <name>Josh</name>
  <skills>
   <skill>JavaScript</skill>
   <skill>XML</skill>
   <skill>Flex</skill>
  </skills>
 </person> 
</people>

我希望能够使用E4X找到所有符合我传递的技能列表/数组的人物对象。所以,我想要找到所有具有HTML或JavaScript技能的人。

我知道我能做到:

people.person.(descendants("skill").contains("HTML"))

people.person.(descendants("skill").contains("JavaScript"))

但我真的希望(/需要)做一行(它是Flex中XMLListCollection过滤器函数的一部分)。

这样的事情是理想的

people.person.(descendants("skill").contains("HTML","JavaScript"))

虽然我尝试过这个主题的变化而无处可去。什么会很棒:

people.person.(descendants("skill").in("HTML", "JavaScript"))

或类似的东西。

有人知道我在做什么是可能的吗?

我真的想避免在那里添加我自己的循环。

杰克

1 个答案:

答案 0 :(得分:2)

未使用编译器对此进行验证,但此应该工作...

people.person.(descendants("skill").contains("HTML") || descendants("skill").contains("JavaScript"))

这是另一种观点 -

如果你想在E4X声明中检查一个数组,我想你运气不好。虽然有一种可能的解决方法,但它涉及在E4X中使用自定义函数,只需将循环移动到主代码块之外。如果你真的想避免循环,那就多余了。

var skillsArray:Array = ["HTML", "JavaScript"];
var peopleWithSkills:XMLList = people.person.(matchSkills(descendants("skill"), skillsArray));

function matchSkills(xmlList:XMLList, skillsArray:Array):Boolean
{
    for each (var personSkill:XML in xmlList)
    {
        if (skillsArray.indexOf(personSkill.toString()) > -1)
        {
            return true;
        }
    }

    return false;
}

我最好的建议是真实地调查你的内心并决定你是否需要以避免循环,或者你只是想避免它们。 ;)