2009-06-01 4 views
6

Array.indexOf()를 사용하여 배열 내의 객체 속성으로 배열을 검색 할 수 있습니까?AS3 - 개체 속성별로 배열을 검색 할 수 있습니까?

var myArray:Array = new Array(); 
var myMovieClip = new MovieClip(); 

myMovieClip.name = "foo"; 

myArray.push(myMovieClip); 
myArray.indexOf(MovieClip.name == "foo"); //0 

또는

myArray.indexOf(myMovieClip.name == "foo"); //0 
위의 indexOf()는 작동하지 않습니다. 올바른 구문을 사용하여이 작업을 수행 할 수 있습니까?

답변

3

index of는 항목을 검색합니다 ... MovieClip에는 "name"속성이 없으므로 MovieClip.name == "foo"는 컴파일러 오류를 발생시켜야합니다 ... myMovieClip.name == "foo" 사실을 입력하고 배열에있는 경우 true를 반환합니다.

인덱스가 실제로 필요한 경우 배열을 반복 할 필요가 있습니다 ... 키를 사용하거나 배열이 숫자이고 밀도가 높으면 증분 루프 ... 배열이 연관성이있는 경우 (문자열 키

//this will return an array of all indices 
myArray.map(function (val:*,index:int,...rest):int { return (val.name == "foo") ? index : -1 }).filter(function (val:int,...rest):Boolean { return val != -1 }); 

//here a more reusable utility function ... you may want to put it to some better place ... just as an example ... 
package { 
    public class ArrayUtils { 
      public static function indexOf(source:Array, filter:Function, startPos:int = 0):int { 
       var len:int = source.length; 
       for (var i:int = startPos; i < len; i++) 
        if (filter(source[i],i,source)) return i; 
       return -1; 
      } 
    } 
} 
//and now in your code: 
var i:int = ArrayUtils.indexOf(myArray, function (val:*,...rest):Boolean { return val.name == "foo" }); 
: 숫자 배열의

, 나는 다음과 같은 두 가지 방법 중 하나를 건의 할 것입니다 ... 당신은 명령 적 필터 및 관련 함수는 숫자 인덱스를 포함하기 때문에, 대한-에서 루프를 사용할 필요가) 사용

도움이 된 희망 ...;)

greetz

(210)

back2dos

4

어레이의 필터 방법 (AS3에서 새로 사용 가능)을 살펴보십시오. 당신이 변수를 지정하려면

0
myMovieClip.name == "foo"; 

이^== 사용 당신은 당신의 기준을 충족하는 모든 개체를 반환하는 필터 방법 (귀하의 경우를 특정 이름을 가진 무비 클립)를 쓸 수

myMovieClip.name = "foo"; 
+0

정말 답이 아닙니다. –

+0

원래 질문 "두 indexOf() 위의 작동하지 않는다",하지만 난 indexOf 실패한 버그를 진술하고 있어요 – Unreality

2

back2dos '방법은 시원하지만, 나는 것처럼되지 않습니다, 여기에 사용하기 쉽게 될 수있는 간단한 방법이며, 이들의 이익을 위해, 그래서 초보자, 그것은 지나치게 복잡하게 찾을 수 있습니다 생각 어떤 상황에서도 백도어 방식으로 다재다능합니다.

var myArray:Array = new Array(); 
var myMovieClip1 = new MovieClip(); 
var myMovieClip2 = new MovieClip(); 

myMovieClip1.name = "foo"; 
myMovieClip2.name = "bar"; 

myArray.push(myMovieClip1); 
myArray.push(myMovieClip2); 

function getIndexByName(array:Array, search:String):int { 
    // returns the index of an array where it finds an object with the given search value for it's name property (movieclips, sprites, or custom objects) 
    for (var i:int = 0; i < array.length; i++) { 
     if (array[i].name == search) { 
      return i; 
     } 
    } 
    return -1; 
} 

trace("bar index = "+getIndexByName(myArray, "bar")); 
trace("foo index = "+getIndexByName(myArray, "foo")); 
0

다음은 내가 한 것입니다. 원하는 경우 함수 이름을 변경하십시오. 설명의 목적으로 만 사용됩니다.

getObjectFromArrayByProperty(arrayToSearch, 'oBjectProperty', 'value'); 

function getObjectFromArrayByPoperty(array:Array, _property, search:String):Object{ 
    for (var i:int = 0; i < array.length; i++) { 
     if (array[i][_property] == search) { 
       return array[i]; 
     } 
    } 
    return null; 
} 

이렇게하면 색인 대신 개체가 반환됩니다. 일치하는 항목이 없으면이 함수는 null을 반환합니다.

관련 문제