Может, тройной ассоциативный массив? %)
Не, это тоже изврат, но остальное не лучше) Возможно у вас нет варианта красивее тупого перебора, если он не тормозит, то пусть.

Код AS3:
private var dictionaryObj:Dictionary = new Dictionary();
public function pushTriplet(obj:Object, str:String, fun:Object, index:int):void {
if(dictionaryObj[obj] == null) {
dictionaryObj[obj] = new Object();
dictionaryObj[obj][str] = new Dictionary();
dictionaryObj[obj][str][fun] = index;
}
else if(dictionaryObj[obj][str] == null) {
dictionaryObj[obj][str] = new Dictionary();
dictionaryObj[obj][str][fun] = index;
}
else if(dictionaryObj[obj][str][fun] == null) {
dictionaryObj[obj][str][fun] = index;
}
else {//index already exists, overwriting
dictionaryObj[obj][str][fun] = index;
}
}
public function getIndexByTriplet(obj:Object, str:String, fun:Object):int{
if(dictionaryObj[obj] && dictionaryObj[obj][str] && dictionaryObj[obj][str][fun] != null) {
return dictionaryObj[obj][str][fun];
}
else {//no index
return -1;
}
}
public function deleteIndexByTriplet(obj:Object, str:String, fun:Object):void {
if(dictionaryObj[obj] && dictionaryObj[obj][str])
delete dictionaryObj[obj][str][fun];
//ещё можно добавить проверки на то, что dictionaryObj[obj][str] пуст, чтоб его мочить, но влом
}
//итерирование писать тоже влом, очевидно же =)