문제
다음 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;
}
나의 최선의 제안은 실제로 당신의 마음을 바라보고 당신이 필요 루프를 피하거나 단지 루프를 피하고 싶다면. ;)
제휴하지 않습니다 StackOverflow