Можно ли легко сделать индексированный массив ассоциативным в ActionScript? - PullRequest
1 голос
/ 15 февраля 2011

У меня уже есть многомерный массив, извлеченный из файла CSV через csvlib

У меня также есть заголовки в массиве, и я хотел бы получить способ назначить этот массив в качестве ключей для массивов.

вот упрощение

есть массив данных, например,

данные [0] -> [0] синий, [1] 1984, [2] среда [1] -> [0] зеленый, [1] 1926, [2] пятница

и простой массив ключей / свойств (массив заголовков), например:

[0] цвет, [1] год, [2] день недели

Я хотел бы вставить ключи, чтобы сделать данные [0] -> [цвет] синий, [год] 1984, [день недели] среда [1] -> [цвет] зеленый, [год] 1926, [день недели] пятница

Я немного прочитал об ассоциативных массивах и не понимаю, как это сделать. (есть 38 свойств, поэтому помните, что в прямом индексированном массиве будет довольно неудобно)

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Я предполагаю, что ваш CSV использует ; в качестве разделителя полей, вы читаете CSV с помощью URLLoader, и загрузка завершается успешно.

В вашем completeHandler вы теперь будете звонить csvToArray(loader.data as String);.

private function csvToArray ( data : String ) : Array
{
    var lines : Array = data.split ( /\R/ );
    var keyArray : Array = lines.splice ( 0, 1 )[0].split ( ";" );
    var assocArray : Array = [];
    for each (var line:String in lines)
    {
        var valArray : Array = line.split ( ";" );
        var assoc : Object = {};
        for (var i : int = 0; i < keyArray.length; i++)
        {
            var key : String = keyArray[i];
            if (key != null && key != "") assoc[key] = valArray[i];
        }
        assocArray.push ( assoc );
    }
    return assocArray;
}

Вот что происходит:

  1. Считывание первой строки CSV в keyArray
  2. Считывание каждой оставшейся строки в valArray
  3. Используйте оба для заполнения assocArray
1 голос
/ 15 февраля 2011

Ну, вы просто хотите, чтобы ваш массив второго уровня был простым объектом. Позвольте мне показать вам код:

var data:Array = [];

var record1:Object = {"colour": "blue", "year": "1984", "weekday": "wednesday"};
var record2:Object = {"colour": "green", "year": "1926", "weekday": "friday"};

data.push(record1);
data.push(record2);

trace("record 1:", data[0]["colour"], data[0]["year"], data[0]["weekday"]);
trace("record 2:", data[1]["colour"], data[1]["year"], data[1]["weekday"]);

Выход:

record 1: blue 1984 wednesday
record 2: green 1926 friday

Итак, я бы преобразовал массив данных в структуру, которую вы хотите, примерно так:

for (var i:int = 0; i < data.length; i++) {
  var record:Array = data[i];
  var newRecord:Object = {};

  for (var index:int in record)
    newRecord[headers[index]] = record[index];  

  data[i] = newRecord;
}

Теперь ваш массив данных является массивом ассоциативных массивов.

...