質問

次の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;
}

私の最善の提案は、あなたの心を本当に見て、あなたが 必要 ループを避けるため、またはそれらを避けたい場合。 ;)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top