如果你願意花一些內存的查找表,這將是非常快:
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