flash as3, как предотвратить добавление элемента в массив, если он уже существует в массиве - PullRequest
0 голосов
/ 22 июня 2011

Я знаю, как удалить дубликаты из массива, но я пытаюсь сделать так, чтобы элемент вообще никогда не добавлялся в массив, если он уже существует.Я извлекаю данные из ленты XML в цикле, и я подумал, что поиск этого индекса значений будет работать, но, несмотря ни на что, индекс всегда равен -1.Вот мой код:

var yearArr:Array = new Array();

for (var i=0;i<numCovers;i++){
  var coverRef = xmlObj.cover[i];
  var coverClip:MovieClip = new MovieClip();
  coverClip.year = coverRef.@year;
  if (yearArr.indexOf(coverClip.year === -1)){
    yearArr.push (coverClip.year);
  }
}

Возможно, я неправильно понимаю функцию indexOf, но я подумал, что она должна вернуть -1, если значение не существует в массиве.Что я делаю не так?

Ответы [ 4 ]

1 голос
/ 24 июня 2011

Ваш код почти в порядке. Проблема в том, что свойство E4X .@year не является литеральной строкой (сейчас я не уверен, но я считаю, что это XMLList объект). Вот почему вызов indexOf будет возвращать -1, потому что он ищет дубликат этого объекта, а не строку. E4X преобразует его в строку, как только вы положите его туда, куда могут идти только строки, но до этого времени это будет нечто другое.

Если вы переписали свой код следующим образом, он должен работать сразу:

var yearArr:Array = new Array();

for each (var coverRef : XML in xmlObj.cover){
  var year : String = coverRef.@year; // force the property to be a string
  if (yearArr.indexOf(year) < 0){
    yearArr.push (year);
  }
}

Было также несколько других оптимизаций, которые вы могли бы сделать с вашим кодом. Часть new MovieClip() не использовалась, не все переменные были строго типизированы, и с помощью цикла for each вы можете гораздо яснее заявить, через какие объекты вы проходите цикл.

1 голос
/ 22 июня 2011

Вот решение, которое я придумал:

var yearArr:Array = new Array();

for (var i=0;i<numCovers;i++){
  var coverRef = xmlObj.cover[i];
  var coverClip:MovieClip = new MovieClip();
  coverYear = coverRef.@year;
  addCoverYear(coverYear);
}

function addCoverYear(coverYear:int):void {
    if (yearArr.indexOf(coverYear) == -1){
        yearArr.push(coverYear);
    }
}
1 голос
/ 22 июня 2011

Вы можете уменьшить массив, передав все в словарь, который автоматически удалит избыточности.затем передайте словарь обратно как новый массив.

//Reduce Array
private function reduceArray(array:Array):Array
    {
    var dictionary:Dictionary = new Dictionary();

    for each    (var element:String in array)
                dictionary[element] = true;

    var result:Array = new Array();

    for         (var key:String in dictionary)
                result.push(key);

    dictionary = null;

    return result;
    }
0 голосов
/ 22 июня 2011

Вот что вы можете сделать, если, например, у вас есть массив строк.

var ItemList:Array = new Array();

for each(var Item:String in UseYourXMLFeed) 
 {
    if(ItemList.indexOf(Item) == -1) 
    {
        ItemList.push(Item);
    }
 }

Редактировать:

В любом случае, вашреальный ответ в комментарии Сэма.

...