descubra se AS3 do XMLList contém a cadeia de caracteres como o nó de valor
-
29-09-2020 - |
Pergunta
Há um XMLList equivalente a Matriz.indexOf?
Por exemplo -
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
...direito?mas o que se eu tenho essa -
var xml:XML = <list><item>one</item><item>two</item><list>
var xmlList:XMLList = list.item;
tem de haver uma maneira mais fácil de verificar para ver se um de nós no XMLList tem um determinado valor de um loop através de todos eles, certo?algo semelhante -
xmlList.indexOfChildByNodeValue('two'); // returns 1, because it's the second child
xmlList.indexOfChildByNodeValue('three'); // returns -1, because it doesn't match any children
faz sentido?
Solução
Eu coloquei uma demonstração de como você pode fazê-lo sem loop.Apesar de não chamar um pouco mais adiantado do trabalho.Que vale a pena se você estiver indo para ser a verificação de valores de um monte.
<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>
A idéia básica é que você armazena o índice do primeiro item
e, em seguida, subtrair-se que a partir do childIndex()
da correspondência resultado usando E4X de pesquisa.
Outras dicas
Eu acho que a única aposta é percorrer o XMLList.A outra opção é usar: contém() Apesar de que isso só vai ajudar a sua situação, se você realmente só quer saber se indexOf() == || != -1
.
Eu não estou certo de como o XMLList, na verdade, é armazenado em C++ subjacente, mas se ele realmente é apenas uma matriz e, em seguida, uma pesquisa linear O(n) é o melhor que você vai fazer.