2010-07-26 3 views
2

Есть ли эквивалент XMLList для Array.indexOf?выяснить, есть ли в XMLList AS3 строка как значение узла

Например -

var array:Array = ['one','two']; 
trace(array.indexOf('two')); // returns 1, since it's at the second position 
trace(array.indexOf('three')); // returns -1, since it isn't found 

... верно? но что, если у меня есть это -

var xml:XML = <list><item>one</item><item>two</item><list> 
var xmlList:XMLList = list.item; 

там должен быть более простой способ, чтобы проверить, если один из узлов в XMLList имеет особое значение, чем цикл через все из них, не так ли? что-то похожее на -

xmlList.indexOfChildByNodeValue('two'); // returns 1, because it's the second child 
xmlList.indexOfChildByNodeValue('three'); // returns -1, because it doesn't match any children 

иметь смысл?

ответ

5

Я собрал демо, как вы можете это сделать без цикла. Хотя он и требует немного более авансовой работы. Хотя это окупается, если вы собираетесь проверять ценности много.

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" applicationComplete="_init();"> 
    <fx:Declarations> 
     <fx:XML id="movieList" source="http://www.movies.com/rss-feeds/jen-yamato-reviews-rss" /> 
    </fx:Declarations> 
    <fx:Script> 
     <![CDATA[ 
      import mx.logging.ILogger; 
      import mx.logging.Log; 
      import mx.logging.LogEventLevel; 
      import mx.logging.targets.TraceTarget; 

      public static const MOVIE_TITLE:String = "Inception"; 

      private var _logger:ILogger = Log.getLogger("Sandbox"); 

      private function _init() :void 
      { 
       var traceTarget:TraceTarget = new TraceTarget(); 
       traceTarget.level = LogEventLevel.ALL; 
       Log.addTarget(traceTarget); 

       var xmlList:XMLList = movieList..item; 

       var firstItem:XML = movieList..item[0]; 
       var firstItemIndex:int = firstItem.childIndex(); 
       _logger.info("First Item Index: " + firstItemIndex); 

       var item:XML = xmlList.(title == MOVIE_TITLE)[0]; 
       _logger.info("Contains: " + xmlList.contains(item) + " // " + item.childIndex()); 

       var actualIndex:int = (item.childIndex() - firstItemIndex); 
       _logger.info("Actual Index: " + actualIndex); 

       _logger.info("Result: " + xmlList[actualIndex]); 
      } 
     ]]> 
    </fx:Script> 

</s:Application> 

Основная идея заключается в том, что вы храните индекс первого item, а затем вычесть, что из childIndex() согласованного результата с помощью поиска E4X.

+0

Wow, overachiever! Я подумал, что есть отличный способ сделать это с E4X - так что мясо вашего примера - «movieList..item. (Title ==« MovieTitle »)« правильно? Это работает, потому что каждый узел узла имеет узел заголовка - в моем случае, представьте, что узлы элементов содержат ничего, кроме названий фильмов, как значение узла. будет ли это выглядеть ... "movieList .. (item == 'MovieTitle')"? –

+1

В вашем примере это будет: xmlList. (ToString() == "one") – Patrick

+0

@ matt-lohkamp - ха-ха, спасибо. Мне нравится, чтобы мой ответ был прав в песочнице, прежде чем публиковать его здесь. Патрик правильно, как это сделать, используя ваш пример. Я лично использовал бы 'text()', а не 'toString()' хотя. Проверьте документацию и решите сами, какие наилучшие варианты вам нужны. http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/XML.html – cynicaljoy

1

Я думаю, что единственная ставка - это цикл через XMLList. Другой вариант, который у вас есть, заключается в использовании: contains() Хотя это поможет только в вашей ситуации, если вы действительно хотите узнать только, indexOf() == || != -1.

Я не уверен, как XMLList фактически хранится в базовом C++, но если это действительно просто массив, то линейный поиск O (n) - это лучшее, что вы собираетесь делать.

+0

Я уверен, что линейный поиск - это то, что происходит под капотом для Array.indexOf, так что да, вы, вероятно, правы. Я просто хотел убедиться, что не существует более простого способа написания этой строки кода. Я посмотрел на XMLList.contains(), но это соответствует узлам XML, и в этой ситуации я знаю только текстовое значение узла (это XML.toString()), а не значение других атрибутов - я предполагаю, что функция хочет точное совпадение, а не только совпадение значения узла. спасибо! –

Смежные вопросы