【问题标题】:flash as3 how to prevent an item from being added to an array if it already exists in the arrayflash as3如果数组中已经存在一个项目,如何防止它被添加到数组中
【发布时间】:2011-06-22 03:42:08
【问题描述】:

我知道如何从数组中删除重复项,但我想要做的是首先防止一个项目被添加到一个数组中,如果它已经存在的话。我在循环中从 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。我做错了什么?

【问题讨论】:

  • indexOf函数计算左括号(和右括号)。注意到有什么奇怪的吗?
  • 这只是一个错误类型 - 无论如何,有效代码都会将年份推送到数组中。不过,我已经编辑了上面的代码,很好。
  • 这很奇怪 - 如果你用实际数字代替变量引用,我上面的代码实际上可以工作......
  • yearArr.indexOf(coverClip.year === -1) LOL 想知道他有没有得到它

标签: arrays flash actionscript-3


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这是您可以执行的操作,例如,如果您有一个字符串数组。

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

        编辑:

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

        【讨论】:

        • 搜索不是flash中的功能
        • 哦,对不起,我的意思是 indexOf。好吧,我更早地将它写成 OP 的算法......猜猜这就是“搜索”这个词的来源。谢谢你指出。 :)
        猜你喜欢
        • 2021-09-27
        • 2019-10-21
        • 1970-01-01
        • 2018-10-18
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        相关资源
        最近更新 更多