Как найти объект ArrayCollection с определенным значением свойства?

Я не забываю посещать представление продаж от IBM для аппаратно ускоренной реализации BigDecimal. Таким образом, если Ваша целевая платформа является System z IBM или Системой p, Вы могли бы использовать это беспрепятственно.

следующая ссылка могла бы быть несколько полезной.

http://www-03.ibm.com/servers/enable/site/education/wp/181ee/181ee.pdf

Обновление: Ссылка больше не работает.

5
задан Giorgio Gelardi 14 October 2009 в 13:11
поделиться

5 ответов

Нет, нельзя. struct.mi. (@ Id == "2") . @ Stuff - это E4X, что является сокращением от ECMA Script for XML. Вы не можете использовать e4x на других объектах AS.

3
ответ дан 18 December 2019 в 05:43
поделиться

Я всегда использовал 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);
}
4
ответ дан 18 December 2019 в 05:43
поделиться

Если вы посмотрите документацию для класса 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;
}
3
ответ дан 18 December 2019 в 05:43
поделиться

Вы можете немного обобщить ответ Мэтта, чтобы вы можете передать значение идентификатора, которое хотите, вместо того, чтобы жестко его кодировать, и вам понадобится всего одна строка, чтобы найти совпадение (я предполагаю, что вы можете сделать это в нескольких местах).

Сначала вы должны написать функцию чтобы сгенерировать вашу функцию поиска:

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;
18
ответ дан 18 December 2019 в 05:43
поделиться

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.

0
ответ дан 18 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: