質問
次の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"))
またはそのようなもの。
私がしていることが可能かどうか知っている人はいますか?
私は本当に自分のループを追加しないようにしたいです。
ジェイク
解決
これをコンパイラで確認しませんでしたが、これは確認しませんでした したほうがいい 仕事...
people.person.(descendants("skill").contains("HTML") || descendants("skill").contains("JavaScript"))
これが別のテイクです -
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;
}
私の最善の提案は、あなたの心を本当に見て、あなたが 必要 ループを避けるため、またはそれらを避けたい場合。 ;)
所属していません StackOverflow