문제

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

그러나 나는 정말로 (/need) 그것을 한 줄 (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 문의 배열에 대해 확인하고 싶다면 운이 좋지 않은 것 같습니다. 그러나 가능한 한 가지 해결 방법이 있지만 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