Чтение отдельных данных из коллекции массивов

Я использовал var dp:ArrayCollection = new ArrayCollection(container.GetVotesResult); для получения данных JSON из метода GetVotesResult. Я получаю значения, как показано ниже.

{"GetVotesResult":
[{"Aid":0,"Arank":0,"Atext":null,"ClientId":16,"Votes":0,"qid":10,"qtext":"Who will win 2011 football world cup?"},
{"Aid":4,"Arank":1,"Atext":"yes","ClientId":null,"Votes":0,"qid":null,"qtext":null},
{"Aid":5,"Arank":2,"Atext":"no","ClientId":null,"Votes":0,"qid":null,"qtext":null},
{"Aid":6,"Arank":3,"Atext":"i don't know","ClientId":null,"Votes":0,"qid":null,"qtext":null}]}

Я могу получить данные 1-го массива после зацикливания списка коллекции массивов dp.

if(i==0)
{
 trace("Show me:",obj.qtext);
}
O/P: Show me: Who will win 2011 football world cup?

Как получить 2-й, 3-й, 4-й и т. д. (если он есть) данные массива индивидуально и динамически. Скажем, я хочу взять «Atext» из всего массива. Пожалуйста помоги. Я использую flashbuilder 4.5.


person Dinesh    schedule 11.01.2012    source источник


Ответы (3)


Из приведенного выше вывода GetVotesResult представляет собой массив объектов, который вы можете перебирать с помощью цикла for/for each, например:

var result : String = "";  // JSON String omitted for brevity

// Decode the JSON String into an AS3 Object graph.
var data : Object = JSON.decode(result);

// reference the GetVotesResult Array from the result Object.
var votes : Array = data["GetVotesResult"];

// Iterate over each 'Vote' object in turn and pull out the 
// 'Atext' values the objects contain into a new Array.
var Atexts : Array = [];
for each (var vote : Object in votes) 
{
    // Check for the existance of the 'aText' property.
    if (vote.hasOwnProperty("Atext")) {
        Atexts.push(vote.Atext);
    }
}

// Dump out all the aText values: (,yes, no, i)
trace("Atexts: " + Atexts.join(", "));

В качестве альтернативы вы можете скопировать объекты в структуру данных карты (Dictionary в AS3), чтобы создать таблицу поиска на основе одного из ключей:

// Create a new, empty Lookup Table.
var votesByAid : Dictionary = new Dictionary();

// Iterate through the Vote Objects and add each one to the 
// lookup table based on it's Aid property.
for each (var vote : Object in votes) 
{
    // Check for the existance of the 'aId' property to stop
    // any 'nulls' getting into our Lookup Table.
    if (!vote.hasOwnProperty("Aid")) {
        trace("Vote Object did not contain an `Aid` property.");
        continue;
    }

    // Add the entry to the lookup table.
    var key : String = vote.Aid;
    votesByAid[key] = vote;
}

// You can now use the lookup table to fetch the Vote Objects.
trace(votesByAid[6].Atext); // traces 'i don't know'
person JonnyReeves    schedule 11.01.2012

Вы можете использовать filter() и map() для создания новых массивов нужных вам данных.

Предположим, вы уже получаете данные JSON в arrayCollection (или массив), поэтому для этого примера я просто создаю массив:

private var GetVotesResult:Array = [{"Aid":0,"Arank":0,"Atext":null,"ClientId":16,"Votes":0,"qid":10,"qtext":"Who will win 2011 football world cup?"},
{"Aid":4,"Arank":1,"Atext":"yes","ClientId":null,"Votes":0,"qid":null,"qtext":"Who stole my socks?"},
{"Aid":5,"Arank":2,"Atext":"no","ClientId":null,"Votes":0,"qid":null,"qtext":null},
{"Aid":6,"Arank":3,"Atext":"i don't know","ClientId":null,"Votes":0,"qid":null,"qtext":null}];

Теперь вы можете использовать Array.filter для создания нового массива, который содержит только те элементы, которые имеют допустимое значение для нужного поля:

//Get an array with elements that have the desired property:
public function getElementsWithProperty( propName:String ):Array {
    return GetVotesResult.filter( elementHasProp( propName ) );
}
private function elementHasProp( propName:String ):Function {
    return function( element:Object, index:int, array:Array ):Boolean {
        return ( element[ propName ] != null );
    }
}

Чтобы проверить вышеизложенное:

var elementsWithQText:Array = getElementsWithProperty( 'qtext' );

trace( 'Values of qtext in elementsWithQText array: ' );
for each ( var element:Object in elementsWithQText ) {
    trace( element.qtext );
}
//OUTPUT:
//Values of qtext in elementsWithQText array: 
//Who will win 2011 football world cup?
//Who stole my socks?

Или вы можете использовать Array.map для создания массива только значений для определенного свойства:

//Get an array of only a certain property:
public function makeArrayOfProperty( propName:String ):Array {
    return GetVotesResult.map( valueOfProp( propName ) );
}
private function valueOfProp( propName:String ):Function {
    return function( element:Object, index:int, array:Array):String {
        return element[ propName ];
    }
}

Вы можете протестировать функцию карты выше с помощью:

var valuesOfAtext:Array = makeArrayOfProperty( 'Atext' );
trace( 'Values of valuesOfAtext: ' + valuesOfAtext );
//OUTPUT: Values of valuesOfAtext: ,yes,no,i don't know

Эта страница отлично описывает карту, фильтр и остальную часть массива: http://www.onebyonedesign.com/tutorials/array_methods/

person Seanonymous    schedule 18.01.2012
comment
Хотя Array.filter, Array.map и другие функциональные методы Array/Vector довольно хороши и допускают несколько приятных вызовов методов в цепочке, они, к сожалению, работают немного медленнее, чем их более традиционные аналоги, основанные на циклах. - person JonnyReeves; 20.01.2012

это может получить всю строку из этого объекта

for(var i=0;i<data.length;i++){
        for(var key in d){
        if(d[key] instanceof String)
            trace(d[key]);
    }
}
person Guan Yuxin    schedule 11.01.2012