سؤال

قل لدينا 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"))

لكنني أريد حقا (/ حاجة) للقيام بذلك سطر واحد (إنه جزء من وظيفة مرشح XMLListCollection في Flex).

شيء من هذا القبيل سيكون مثاليا

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