Arrays flash as3如何防止在阵列中已存在项时将其添加到阵列中

Arrays flash as3如何防止在阵列中已存在项时将其添加到阵列中,arrays,flash,actionscript-3,Arrays,Flash,Actionscript 3,我知道如何从数组中删除重复项,但我要做的是,如果某个项已经存在,首先要防止它被添加到数组中。我在循环中从xml提要中提取数据,我认为搜索该值索引会起作用,但无论如何,索引总是-1。这是我的密码: var yearArr:Array = new Array(); for (var i=0;i<numCovers;i++){ var coverRef = xmlObj.cover[i]; var coverClip:MovieClip = new MovieClip(); cov

我知道如何从数组中删除重复项,但我要做的是,如果某个项已经存在,首先要防止它被添加到数组中。我在循环中从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);
  }
}
var yearr:Array=new Array();

对于(var i=0;i这里是您可以做的,例如,如果您有一个字符串数组

var ItemList:Array = new Array();

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

编辑:


不管怎么说,你的真正答案在Sam的评论中。

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

var ItemList:Array = new Array();

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

编辑:


不管怎么说,你的真正答案在Sam的评论中。

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

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);
    }
}
var yearr:Array=new Array();

对于(var i=0;i,我提出了以下解决方案:

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);
    }
}
var yearr:Array=new Array();

对于(var i=0;i您可以通过将所有内容传递给字典来减少数组,这将自动删除冗余。然后将字典作为新数组传递回去

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

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

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

您的代码几乎没有问题。问题是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);
  }
}
var yearr:Array=new Array();
对于每个(var coverRef:xmlObj.cover中的XML){
var year:String=coverRef@year;//强制属性为字符串
如果(年份)年数指数小于0{
年份arr.push(年);
}
}

您还可以对代码进行一些其他优化
部分没有使用,并非所有变量都是强类型的,通过对每个
循环使用
,您可以更清楚地说明正在循环的对象。

您的代码几乎没有问题。问题是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);
  }
}
var yearr:Array=new Array();
对于每个(var coverRef:xmlObj.cover中的XML){
var year:String=coverRef@year;//强制属性为字符串
如果(年份)年数指数小于0{
年份arr.push(年);
}
}

您还可以对代码进行一些其他优化。没有使用
new MovieClip()
部分,不是所有变量都是强类型的,通过对每个
循环使用
,您可以更清楚地说明正在循环的对象。

计算开始括号
和右括号
在使用
indexOf
函数的行上。注意到有什么奇怪的吗?这只是一个错误类型-有效代码会将年份推送到数组中,不管发生什么。我编辑了上面的代码,很好。很奇怪-如果用实际数字代替变量引用…yearr.indexOf,我上面的代码实际上可以工作(coverClip.year===-1)哈哈,我想知道他是否得到了它。记下开头的括号
和结尾的括号
在使用
indexOf
函数的行上。注意到有什么奇怪的吗?这只是一个错误类型-有效代码会将年份推送到数组中,不管发生什么。我编辑了上面的代码,很好。很奇怪-如果用实际数字代替变量引用…yearr.indexOf,我上面的代码实际上可以工作(coverClip.year===-1)哈哈,不知道他是否明白了yetsearch不是FlashOh中的函数对不起,我是指indexOf。我写它更多的是作为OP的一个算法,早些时候……我猜“搜索”这个词就是从这里来的。谢谢你指出。:)搜索不是FlashOh中的一个函数抱歉,我指的是indexOf。我写它更多的是作为OP的一个算法,早些时候……我猜“搜索”这个词就是从这里来的。谢谢你指出。:)