Pregunta

Supongamos que tenemos el siguiente código 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>

Lo que yo quiero ser capaz de hacer con E4X es encontrar todos los objetos persona que responden a una lista / conjunto de habilidades lo paso. Por lo tanto, digo que quiero encontrar todas las personas con HTML o habilidades de JavaScript.

Sé que puedo hacer:

people.person.(descendants("skill").contains("HTML"))

o

people.person.(descendants("skill").contains("JavaScript"))

Pero realmente quiero (/ necesidad) para hacerlo una línea (que es parte de una función de filtro XMLListCollection en Flex).

Algo como esto sería ideal

people.person.(descendants("skill").contains("HTML","JavaScript"))

A pesar de que he intentado variaciones sobre ese tema y no llegó a nada. Lo que sería grande sería:

people.person.(descendants("skill").in("HTML", "JavaScript"))

o algo por el estilo.

Alguien sabe si lo que estoy haciendo es posible?

Realmente quiero evitar añadir mis propios bucles en ese país.

Jake

¿Fue útil?

Solución

No verificar esto con el compilador pero esto debe de trabajo ...

people.person.(descendants("skill").contains("HTML") || descendants("skill").contains("JavaScript"))

Aquí está otra toma -

Si desea comprobar en contra de una matriz dentro de la instrucción E4X, supongo que estás de suerte. Hay una posible solución, sin embargo, sino que implica el uso de una función personalizada en el interior del E4X, y simplemente moviendo el bucle fuera de su bloque de código principal. Tipo de redundante, si realmente quiere evitar bucles.

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

Mi mejor sugerencia sería mirar realmente en su corazón y decidir si necesidad para evitar los bucles, o si lo que desea es evitarlos. ;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top