Преобразование массива в строку

Массивы — это очень удобная форма хранения информации. Но она пригодна только в том случае, если данные будут локализованы в swf-фильме. Если же информацию необходимо передать Web-серверу, сценарию JavaScript или же просто записать ее в файл, то может быть использован только строковый формат. Возникает задача: как преобразовать данные, хранящиеся в массиве, в строку.

Наиболее универсальный инструмент, переводящий массивы в строковое представление, — это метод join(). Его синтаксис:

arr.join (delimiter),
где:

• arr — массив, текстовый аналог которого должен быть получен;
• delimiter — символ или последовательность символов, которые должны разделять соответствующие элементам подстроки. Если данный параметр опущен, то в качестве разделителя используется запятая.

Метод join() последовательно переводит все элементы массива в строки, конкатенирует их с использованием символов-разделителей и возвращает результат. Например:

var arr:Array=[_root, 0x87, {}];
trace(arr.join("***")}; // Выводит: _level0***135***[object Object]

Если массив является вложенным (т. е. его элементами являются другие массивы), то образующие его массивы также будут переведены в строки.


Однако, так как для их преобразования будет использован не метод join(), а особый внутренний алгоритм (его реализует метод toString()), то в качестве разделителей подстрок, созданных на основании их элементов, всегда будет использоваться запятая:

var arr:Array = [[1,2], [3,4], [5,[6,7]]];
trace(arr.join("***")); // Выводит: 1, 2***3, 4***5, 6, 7

Функции, обратные функциям метода join(), выполняет уже знакомый нам метод split() класса String. Он позволяет на базе строки воссоздать массив. Например:

var str:Atring="1***2***3";
var arr:Array=str.split("***");
trace(arr); // Выводит: 1, 2, 3

Вторым методом класса Array, выполняющим преобразование массива в строку, является toString(). Данный метод использует только один вид разделителя — запятую. Метод toString() соответствует методу join(), когда последний применяется без задания параметра:

var arr:Array=[_root,{},undefined]
trace(arr.toString()); // Выводит: level0,[object Object), undefined
trace(arr.join()); // Выводит: level0,[object Object], undefined

Такой же алгоритм, как и положенный в основу метода toString(), используется при передаче массива функции trace().


Поэтому в панели Output мы видим не реальные значения элементов массива, а их строковые аналоги:

trace([_root,{},undefined]); // Выводит: _level0,[object Object}, undefined

Поскольку перед выводом в Output массивы преобразуются в строки, это может явиться причиной того, что об их внутренней структуре будет сделан неверный вывод. Например, если мы зададим пустой массив нулевой длины и присвоим его свойству length значение N>0, то при этом не произойдет создания элементов (проверить это можно при помощи цикла for—in). Однако если мы попытаемся трассировать массив, то положенное количество элементов будет отображено в Output:

var arr:Array = []; // Создаем пустой массив
arr.length = 5; // Увеличиваем длину массива до 5
for (var i in arr} {
trace (i); // в Output ничего не появляется - элементы не были созданы
}
trace(arr]; // Выводит: undefined,undefined,undefined,undefined,undefined

При выведенной в Output последовательности значений наиболее очевидным выводом будет то, что якобы при изменении свойства length создаются новые элементы и им присваивается значение undefined. Аналогичную ошибку несложно сделать, анализируя результат использования по отношению к элементу массива оператора delete.

То, что в полученных на основании массивов строках отображаются даже те элементы, которые реально не существуют, объясняется следующим.


Алгоритм трансформации массивов в строки не перебирает, подобно циклу for—in, реально имеющиеся элементы. Он просто последовательно обращается к свойствам с именами от 0 до length-1. Если свойства не существует, то возвращается величина undefined. Это объясняет, почему массиву, у которого реально нет элементов, соответствует строка порой из значительного числа подстрок «undefined».

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Выделение фрагмента массива
Длина массива. Свойство length
Добавление элементов в массив
Извлечение и переопределение элементов массива
Инверсия массива

Вернуться в раздел: Action Script / 7. Массивы (класс Array)