1

假设我们有以下 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"))

或类似的东西。

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

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

杰克

4

1 回答 1

2

没有用编译器验证这一点,但这应该可以工作......

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

这是另一种看法——</p>

如果你想检查 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;
}

我最好的建议是真正审视你的内心并决定是否需要避免循环,或者你是否只想避免它们。;)

于 2009-09-30T04:18:30.837 回答