flash as3如果项目已经存在于数组中,如何防止将项目添加到数组中

时间:2011-06-22 03:42:08

标签: arrays flash actionscript-3

我知道如何从数组中删除重复项,但我想要做的是防止项目首先被添加到数组中(如果它已经存在)。我在循环中从xml feed中提取数据,我认为搜索该值索引会起作用,但无论如何,索引始终为-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 个答案:

答案 0 :(得分:1)

以下是我提出的解决方案:

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 :(得分:1)

您可以通过将所有内容传递到字典来减少数组,这将自动删除冗余。然后将字典作为新数组传回。

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

答案 2 :(得分:1)

你的代码几乎没问题。问题是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循环,您可以更清楚地说明您正在循环的对象。

答案 3 :(得分:0)

这是你可以做的,例如,你有一个字符串数组。

var ItemList:Array = new Array();

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

修改

无论如何,你的真实答案在Sam的评论中。