有没有办法一般从数组中删除一个对象?
(可能没有使用array.filter或创建新数组)
示例:
var arr:Array= new Array();
//create dummy objs
for (var i:uint=0; i < 10; i++){
var someObject:SomeClassObject = new SomeClassObject();
someObject.Name ="Amit"+ i;
someObject.Site="http://www.mysite.com/"+i;
//...many more props
arr.push(someObject);
}
//
removeElement("Amit4",arr);
removeElement("Amit8",arr);
//...so on so forth
目前我正在使用array.splice()删除对象
for (var i:Number=0; i < arr.length; i++)
{
if (arr[i].Name == element)
{
arr.splice(i, 1);
}
}
我想以这样的方式编写removeElement,我可以将它用于不同的方式
物体类型。
目前removeElement依赖于implmentation ..
假设我想从给定文件名的文件数组中删除文件。我必须这样做
再次通过改变标准来写“removeElement”。
也可能是我可以改变标准变量标准? 例如:
arr= removeElement("Site","http://www.mysite.com/6",arr)
将从“Site”属性等于“http://www.mysite.com/6”的arr中删除对象 (使用上面的例子)
ie. removeElement(criteria:object,criteria_value(s):object,arr)
全部谢谢。
答案 0 :(得分:13)
使用
if(array.indexOf(obj) != -1)
array.splice(array.indexOf(obj),1);
答案 1 :(得分:10)
我认为最灵活的方法是Array::filter
后面的方法。由调用者决定是否应该通过函数回调来过滤列表中的项目。
现在,如果你想这样做,你可以编写一个这样的简单函数:
function remove(list:Array,callback:Function):Array {
for(var i:int = list.length - 1; i >= 0; i--) {
if(!callback(list[i])) {
list.splice(i,1);
}
}
return list;
}
这将返回列表,因为如果您想链接调用可能会很方便,但它会对您传递的数组起作用,而不是创建新数组。
另请注意,它会向后循环。否则,拼接会给你带来伪造的结果。
您可以像这样使用它:
var arr:Array = [1,2,9,10,455];
trace(arr);
function removeCallback(item:Number):Boolean {
return item < 10;
}
remove(arr,removeCallback);
trace(arr);
这样您就不会受到平等(或不平等)的限制。调用者通过分别返回true或false来确定是保留还是删除项目(以匹配filter
)。所以,它非常像filter
,除了它就地工作。如果需要,您还可以为回调保留相同的接口(传递项目的索引和对原始数组的引用)以使其更加一致。
答案 2 :(得分:2)
顺便说一句,您可以使用字符串作为数组的索引,然后您可以安全地使用'delete'关键字从“中间”内部删除对象(在这种情况下实际上没有“中间”:)数组。
e.g:
var arr:Array = new Array();
arr['o1'] = new Object();
arr['o1'].someproperty = true;
arr['o2'] = new Object();
arr['o2'].someproperty = true;
arr['o3'] = new Object();
arr['o3'].someproperty = true;
trace (arr['o2'].someproperty);
//Returns 'true'
trace (arr['o2']);
//Returns '[object Object]'
delete arr['o2'];
trace (arr['o2']);
//Returns 'undefined'
trace (arr['o2'].someproperty);
//Returns 'TypeError: Error #1010: A term is undefined and has no properties.'
缺点是您将无法知道数组的长度(arr.length将返回0),但您可以自己跟踪它...
答案 3 :(得分:1)
这是一个通用功能,可以做你想要的:
public static function removeItem(array: Array, propertyName: String, value: String): Array
{
var newArray: Array = [];
for (var index: int = 0; index < array.length; index++) {
var item: Object = array[index];
if (item && item.hasOwnProperty(propertyName)) {
if (item[propertyName] != value)
newArray.push(item);
}
}
return newArray;
}