Я не забываю посещать представление продаж от IBM для аппаратно ускоренной реализации BigDecimal. Таким образом, если Ваша целевая платформа является System z IBM или Системой p, Вы могли бы использовать это беспрепятственно.
следующая ссылка могла бы быть несколько полезной.
http://www-03.ibm.com/servers/enable/site/education/wp/181ee/181ee.pdf
Обновление: Ссылка больше не работает.
Нет, нельзя. struct.mi. (@ Id == "2") . @ Stuff
- это E4X, что является сокращением от ECMA Script for XML. Вы не можете использовать e4x на других объектах AS.
Я всегда использовал filterFunctions для ArrayCollections:
private var cmenu:ArrayCollection = new ArrayCollection([
{id:"1", stuff:"whatever"},
{id:"2", stuff:"whatever"},
{id:"3", stuff:"whatever"}
]);
function getItemFromCollection(id:String):Object {
var cmenuFiltered:ArrayCollection = new ArrayCollection(cmenu.toArray());
cmenuFiltered.filterFunction =
function(item:Object):Boolean {
return item.id == id;
}
cmenuFiltered.refresh();
return cmenuFiltered.getItemAt(0);
}
Если вы посмотрите документацию для класса Array , вы найдете несколько подпрограмм, которые помогают в этом, но ни одна из них не является столь краткой, как синтаксис e4x, используемый встроенным -в типе данных XML. В частности, метод filter ()
звучит так, как будто он лучше всего подходит для вашего примера.
Вот пример того, как вы могли бы это сделать с учетом вашей настройки.
var matches : Array = cmenu.source.filter( findId2 );
var stuff : Object = ( matches.length > 0 ? matches[0] : null );
... и функция обратного вызова findId2
:
function findId2( element : *, index : int, array : Array ) : Boolean
{
return element.id == 2;
}
Вы можете немного обобщить ответ Мэтта, чтобы вы можете передать значение идентификатора, которое хотите, вместо того, чтобы жестко его кодировать, и вам понадобится всего одна строка, чтобы найти совпадение (я предполагаю, что вы можете сделать это в нескольких местах).
Сначала вы должны написать функцию чтобы сгенерировать вашу функцию поиска:
function findId(id:int):Function {
return function( element : *, index : int, array : Array ) : Boolean
{
return element.id == id;
}
}
Затем я бы написал функцию для возврата первого совпадения, чтобы вам не нужно было дублировать две строки:
function findInCollection(c:ArrayCollection, find:Function):Object {
var matches : Array = c.source.filter( find );
return ( matches.length > 0 ? matches[0] : null );
}
Затем вы просто сделаете это:
var stuff:String = findInCollection(cmenu, findId(2)) as String;
You can even more generalize Herms answer by adding the property name in the function like this and thus getting a rather generic way of searching by property in an ArrayCollection
private function findInCollection(c:ArrayCollection, findFunction:Function):Array
{
var matches : Array = c.source.filter( findFunction );
return matches;
}
private function findFunction(propertyName:String,propertyValue:*):Function
{
return function( element : *, index : int, array : Array ) : Boolean
{
return element[propertyName] == propertyValue;
}
}
with the following usage
var ac:ArrayCollection=new ArrayCollection(
[{name:'Ben', id:1, age:12},
{name:'Jack', id:2, age:22},
{name:'Joe', id:3, age:17}
]
);
var searchedElements:Array=findInCollection(ac,findFunction('id',2));
it will return an Array with the following object
{name:'Jack', id:2, age:22}
The drawback of this method is that we hard-code the property name with a String. This may be harmful for code maintenance.