AS3 - Можно ли искать массив по свойствам объекта? - PullRequest
6 голосов
/ 01 июня 2009

Можно ли использовать Array.indexOf () для поиска в массиве по свойствам объектов в массиве:

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

myMovieClip.name = "foo";

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

OR

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

Оба indexOf () выше не работают, можно ли добиться этого с правильным синтаксисом?

Ответы [ 5 ]

4 голосов
/ 01 июня 2009

Посмотрите на метод фильтра массива (недавно доступен для AS3). Вы можете написать метод фильтра, который возвращает все объекты, которые будут соответствовать вашим критериям (в вашем случае, мувиклип с определенным именем)

3 голосов
/ 01 июня 2009

индекс будет искать запись ... MovieClip.name == "foo" должен выдать ошибку компилятора, так как MovieClip не имеет свойства "name" ... myMovieClip.name == "foo" будет true , и тогда вы получите индекс true, если он вообще есть в массиве ...

если вам действительно нужен индекс, вам нужно будет перебирать массив ... по ключу ... или в инкрементном цикле, если массив числовой и плотный ... если массив является ассоциативным (используются строковые ключи), вам обязательно нужно использовать циклы for-in, поскольку фильтр и связанные функции будут охватывать только числовые индексы ...

в числовом массиве, я бы предложил один из следующих двух подходов:

//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

back2dos

2 голосов
/ 22 августа 2009

Несмотря на то, что метод back2dos - это круто, я думаю, что новичкам это может показаться слишком сложным, поэтому ради них здесь есть более простой метод, который может быть проще в использовании, хотя и не будет столь же универсальным для любой ситуации, как метод 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 голосов
/ 11 декабря 2009

Вот что я сделал. Измените имя функции, если хотите ... это все только для объяснения.

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;
}

Возвращает объект вместо индекса. Если совпадение не найдено, функция возвращает ноль.

0 голосов
/ 01 июня 2009
myMovieClip.name == "foo";  

^ == если вы хотите присвоить переменную, используйте

myMovieClip.name = "foo";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...