문제

Array.indexOf와 동일한 XMLList가 있습니까?

예를 들어 -

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

말이 되나요?

도움이 되었습니까?

해결책

반복 없이 이를 수행할 수 있는 방법에 대한 데모를 작성했습니다.조금 더 사전 작업이 필요하지만.값을 많이 확인한다면 효과가 있습니다.

<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 검색을 사용하여 일치된 결과를 얻습니다.

다른 팁

내 생각에 유일한 내기는 XMLList를 반복하는 것입니다.다른 옵션은 다음을 사용하는 것입니다. 포함() 실제로 여부만 알고 싶은 경우에만 이것이 귀하의 상황에 도움이 될 것입니다. indexOf() == || != -1.

XMLList가 기본 C++에 실제로 어떻게 저장되는지 잘 모르겠지만 이것이 실제로 배열인 경우 선형 검색 O(n)이 최선입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top