Подсчет элементов в массиве JSON, который находится в объекте - PullRequest
0 голосов
/ 23 февраля 2012

У меня проблема с чистым ActionScript 3, но я подготовил упрощенный тестовый пример во Flex 4 для лучшей наглядности (исходный код ниже):

enter image description here

Поскольку Flash Player 11 / AIR 3 изначально поддерживает JSON, я решил перенести многопользовательскую игру, в которой для связи с сервером используется XML,

Но у меня есть неприятная проблема, связанная с двумя такими объектами, как

                { 9013: [
                    "OK305894249541",
                    "OK151358069597",
                    "OK515549948434",
                ] },
                { 8991: [
                    "OK253525117889",
                    "OK529081480134",
                ] },

Я не знаю как создать функцию ActionScript, которая выдала бы 3 для первого объекта и 2 для второго объекта?

"9013 "и" 8991 "в приведенном выше примере являются номерами игр.

Строки" OKxxxx "представляют игроков.

Игра" полная ", если в ней 3 игрока, в противном случае" свободная ".

Вот мой очень простой TestCase.mxml :

<s:Application 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    creationComplete="init(event)">

    <fx:Declarations>
        <s:RadioButtonGroup id="_filter" change="handleRadio(event);" />
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;

            [Bindable]
            private var _games:ArrayCollection = new ArrayCollection();

            [Bindable]
            private var _all:uint = 0;

            [Bindable]
            private var _vac:uint = 0;

            [Bindable]
            private var _full:uint = 0;

            private function vacantGame(obj:Object):Boolean {
                // XXX how to implement?
                // XXX return true if obj has less than 3 players
                return true;
            }

            private function fullGame(item:Object):Boolean {
                // XXX how to implement?
                // XXX return true if obj has exactly 3 players
                return true;
            }

            private function init(event:FlexEvent):void {
                var i:uint;

                _games.source = OBJ['games'];

                _all = _games.length;

                _vac = 0;
                for (i = 0; i < _games.length; i++)
                    if (vacantGame(_games[i]))
                        _vac++;

                _full = 0;
                for (i = 0; i < _games.length; i++)
                    if (fullGame(_games[i]))
                        _full++;
            }

            private function handleRadio(event:Event):void {
                switch (_filter.selection) {
                    case _allBtn:
                        _games.filterFunction = null; 
                        break;
                    case _vacBtn:
                        _games.filterFunction = vacantGame;
                        break;
                    case _fullBtn:
                        _games.filterFunction = fullGame;
                        break;
                }
                _games.refresh();
            }

            private const OBJ:Object = {
                lobby: [
                    "OK108900197210",
                    "OK266559712237",
                    "DE6577",
                    "DE7981",
                    "OK225312168135",
                    "OK20629248715",
                    "DE7880",
                ],
                games: [
                    { 0: [] },
                    { 9012: [
                        "VK48058967",
                        "MR14315189992643135976",
                        "OK10218913103",
                    ] },
                    { 9013: [
                        "OK305894249541",
                        "OK151358069597",
                        "OK515549948434",
                    ] },
                    { 8991: [
                        "OK253525117889",
                        "OK529081480134",
                    ] },
                    { 8937: [
                        "OK304672497140",
                        "VK90145027",
                        "OK338360548262",
                    ] },
                    { 9005: [
                        "OK40798070412",
                        "DE7979",
                        "OK531589632132",
                    ] },
                    { 9010: [
                        "OK357833936215",
                    ] },
                ]
            };
        ]]>
    </fx:Script>

    <s:HGroup verticalAlign="baseline">
        <s:Label text="Games:" />
        <s:RadioButton id="_allBtn" group="{_filter}" label="All: {_all}" selected="true" />
        <s:RadioButton id="_vacBtn" group="{_filter}" label="Vacant: {_vac}" />
        <s:RadioButton id="_fullBtn" group="{_filter}" label="Full: {_full}" />
    </s:HGroup>
</s:Application>

1 Ответ

1 голос
/ 23 февраля 2012

Правильный ответ - переосмыслить структуру данных.Отбросьте окружающий массив, все игры имеют уникальный идентификатор.*

games: {
    0: [],
    9012: [
        "VK48058967",
        "MR14315189992643135976",
        "OK10218913103",
    ],
    9013: [
        "OK305894249541",
        "OK151358069597",
        "OK515549948434",
    ],
    ...
}

затем

for( var gameNumber : String in OBJ.games ){
    var players : Array = OBJ.games[ gameNumber ];
    if( players.length < 3 ){
        //vacant
    }else{
        //full
    }
}
...