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"))

しかし、私は本当にそれを 1 行で実行したい (/必要がある) 必要があります (これは 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 ステートメント内で配列に対してチェックしたい場合は、運が悪いと思います。ただし、考えられる回避策が 1 つありますが、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 に答える