19 июля 2006

JavaScript: массив объектов - и побыстрее!

Задача стояла так: нагенеривать массив объектов из PHP для JavaScript, чтобы ниже по тексту неизменно закешированный JS-движок эти изменчивые данные использовал. Сначала задача решилась в лоб:
<script>
var arr_locations = new Array;

<?
if(not_empty_array($arr_areas))
{
$i=0;
foreach($arr_areas as $area)
{
echo "arr_locations[".$i."] = new Object;";
echo "arr_locations[".$i."]['lat'] = ".$area["lat"].";";
echo "arr_locations[".$i."]['lng'] = ".$area["lng"].";";
echo "arr_locations[".$i."]['rad'] =
".$area["radius"].";";
$i++;
}
}
?>
</script>



Т.е. на выходе имели следующее:
<script>
var arr_locations = new Array;

arr_locations[0] = new Object;
arr_locations[0]['lat'] = 1.14;
arr_locations[0]['lng'] = 2.1415;
arr_locations[0]['rad'] = 3.141592;

arr_locations[1] = new Object;
arr_locations[1]['lat'] = 4.14;
arr_locations[1]['lng'] = 5.1415;
arr_locations[1]['rad'] = 6.141592;

</script>


Потом снова руки зачесались что-то здесь заоптимизировать.
Основная мысль, которая не давала покоя - зачем явно
указывать последовательно увеличивающийся индекс $i.

И я вспомнил. Массивы в JavaScript можно определять так:
var arr = [1, 2345, 666, 765];

А объекты - так:
var obj = {name: 'vasya', age: 25, sex: male};

Получилась более красивая каша:
<script>
var arr_locations = [
<?
if(not_empty_array($arr_areas))
{
$lines=array();
foreach($arr_areas as $area)
$lines[] = sprintf(
"\n{lat:%f,lng:%f,rad:%f}",
$area["lat"],
$area["lng"],
$area["radius"]);
echo implode(",", $lines);
}
?>
];
</script>


А теперь всё выглядит так (надо полагать, меньше весит = быстрее грузится, особенно при больших объёмах данных):
<script>

var arr_locations=[

{lat:1.14,lng:2.1415,rad:3.141592},
{lat:4.14,lng:5.1415,rad:6.141592}
];
</script>


Есть ещё над чем поработать - имена полей объекта всё время повторяются... Но это уже в другой раз.

5 комментов:

Vadim Voituk комментирует...

Не так давно писал класс для перевода PHP-структур данных в JavaScript-структуры.
Использовал для возврата данных Ajax-запроса.
Если интересно могу поделиться.

A4 комментирует...

А utf8 поддерживает?

Vadim Voituk комментирует...

Поддерживает. Почему бы и нет?

Анонимный комментирует...
Этот комментарий был удален администратором блога.
Smerch комментирует...

скрипт
var jsa =

пхп
$a = array (blablabla); //любой массив;
echo json_encode($a);
/пхп

/скрипт

ps думаю разборчиво, не разрешает теги ипользовать пхи и скрипта

Отправить комментарий