如何从数组中删除长达数百个项目的特定项目?
-eg:
var myArray:Array = ["dog", "cat", "bear", "duck", "frog", etc..., etc...];
当我想从这个数组中删除“duck”时该怎么办?请记住,数组很长,我们不知道“鸭子”在哪里,所以我们不知道它是数组中的索引。 我需要通过它的名称以某种方式获取该项目并将其从数组中删除。
答案 0 :(得分:1)
myArray.splice(myArray.indexOf("duck"), 1);
答案 1 :(得分:1)
这是一种直截了当的方式:
非稳定版本(复制较少)。
for (var i:int, j:int = array.length - 1, temp:Object; i <= j;) {
temp = array[i];
if (temp == "duck") {
array[i] = array[j];
array[j] = temp;
j--;
} else {
i++;
}
}
array.length = i;
稳定版(更多复制,但原始数组的顺序不变):
for (var i:int, j:int, temp:Object; i < array.length; i++) {
temp = array[i];
if (temp != "duck") {
array[j] = temp;
j++;
}
}
array.length = j;
但是,如果您可以确保值是唯一的,则算法会有所不同,因为您不必在找到的项之后验证项目。
如果对数组进行排序,则算法会有很大的不同,因为您可以使用二进制搜索来查找要删除的元素。在一些非常奇特的情况下,例如,如果你有一个有根据的集合(这是你的数组),删除会更简单,因为你正在搜索的项目的位置可以在恒定的时间内确定。后者可以通过使用索引来缓解(简单来说,你可以有一个哈希表,它使用数组的元素作为键,并将它们作为值偏移到数组中)。
同样,您需要考虑所有这些案例以及与您的计划相关的实际情况。
正如我上面提到的,如果您使用不同的数据结构,或者对插入进行排序,或者在插入时编入索引,则可能会有好处。
最后,生成删除了不需要的项目的副本不同于从同一阵列中破坏性地删除项目。
答案 2 :(得分:0)
如果您的阵列很长,那么以某种方式优化它是非常值得的。
一些选项:
1)使用字典;字符串可以是关键。这样做的另一个好处是,在添加/删除元素时不会重新索引列表。
//specify weak keys when you create the dictionary
var myDictionary:Dictionary = new Dictionary(true);
//when you want to delete an item:
myDictionary["duck"] = null;
2)对数组进行排序并使用二进制搜索。有很多关于二进制在线搜索的信息。 Here's one SO question on the topic.
答案 3 :(得分:0)
一种方法是将while循环与Array的indexOf方法结合使用:
var index:int;
while ((index = myArray.indexOf("duck")) >= 0)
{
myArray.splice(index,1);
}
您可以将其包装在函数中并接受Array和String参数,并返回结果数组:
function removeSearchString(sourceArray:Array, searchString:String):Array
{
var index:int;
while ((index = sourceArray.indexOf(search)) >= 0)
{
sourceArray.splice(index,1);
}
return sourceArray;
}
然后你会使用这样的函数:
myArray = removeSearchString(myArray, "duck");