如果你愿意花一些内存的查找表,这将是非常快:
private function remove(data:Array, objectTable:Object, name:String):void {
var index:int = data.indexOf(objectTable[name]);
objectTable[name] = null;
data.splice(index, 1);
}
这个测试是这样的:
private function test():void{
var lookup:Object = {};
var Spokes:Array = [];
for (var i:int = 0; i < 1000; i++)
{
var obj:Object = { name: (Math.random()*0xffffff).toString(16), someOtherProperty:"blah" };
if (lookup[ obj.name ] == null)
{
lookup[ obj.name ] = obj;
Spokes.push(obj);
}
}
var t:int = getTimer();
for (var i:int = 0; i < 500; i++)
{
var test:Object = Spokes[int(Math.random()*Spokes.length)];
remove(Spokes,lookup,test.name)
}
trace(getTimer() - t);
}
这个解决方案的一个重要的事情:它只会工作如果每个“名称”是唯一的。如果有多个具有相同名称的对象,查找表将失败,至少如果它是这样构建的。 – Quasimondo 2010-05-26 21:38:45
有趣......所以你基本上有两个重复数据的列表......一般来说,只使用查找表并放弃这些情况下的阵列会更好?这是否只是因为对象具有'name'属性或者'indexOf'方法在对象的每个属性值中搜索? – mga 2010-05-26 21:48:29
是的,如果您不需要数组用于其他目的(例如按索引排序或访问元素),则可以使用查找表。 indexOf查找对象的实例。在这种情况下,它根本不使用“名称”进行比较。该名称用作查找表中的散列。 – Quasimondo 2010-05-26 21:51:19