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