Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   массивы динамической размерности (https://javascript.ru/forum/misc/9186-massivy-dinamicheskojj-razmernosti.html)

switch001 04.05.2010 09:23

массивы динамической размерности
 
привык в php делать так:

$a=array()
$a[1]="qwr"   // первый элемент
$a['w']['asf']="asfsdfsd"    // элемент w c подэлементом asf с содержимым asfsdfsd

есть ли возможность в javascript сделать подобное?
пробую так:
a = new Array();
a[1,'qwe1',1,1]="qqqqq";
a[3,'qwe2',1,1]="qqqq1";
a[3,'qwe3',1,1]="qqqq2";
$("#not1").html(a[1,'qwe1',1,1]);
$("#not2").html(a[3,'qwe2',1,1]);
$("#not3").html(a[3,'qwe3',1,1]);

<div id="not1"></div>
<div id="not2"></div>
<div id="not3"></div>

выводит
Код:

qqqq2
qqqq2
qqqq2

так как первые ключи оказываются undefined.
пробовал так:
a[1]['qwe1'][1][1]="qqqqq";
a[3]['qwe2'][1][1]="qqqq1";
a[3]['qwe3'][1][1]="qqqq2";
$("#not1").html(a[1]['qwe1'][1][1]);
$("#not2").html(a[3]['qwe2'][1][1]);
$("#not3").html(a[3]['qwe3'][1][1]);

вообще ошибку выдает
В инете искал, не нашел сколь-нибудь похожего, везде создаются массивы/объекты со статической структурой. Может плохо искал?

Kolyaj 04.05.2010 09:46

В JS все объекты динамические, в том числе массивы.

Цитата:

Сообщение от switch001
a[1,'qwe1',1,1]="qqqqq";

А что вы этим сказать-то хотели? Ну придумали синтаксис, ну не работает он.

Перед тем, как использовать сущность, нужно её создать.
var a = [];
a[1] = {};
a[1].qwe = [];
// ...

switch001 04.05.2010 10:06

получается нужно проверять ключ на существование и создавать, если не существует, то создавать.
Иначе ключи будут заменены.
например так пробовал:

a[1]={};
a[1]['qwe1']=[];
a[1]['qwe1'][1]=[];
a[1]['qwe1'][1][1]="qqqqq";

a[3]={};
a[3]['qwe2']=[];
a[3]['qwe2'][1]=[];
a[3]['qwe2'][1][1]="qqqq1";

a[3]={};
a[3]['qwe3']=[];
a[3]['qwe3'][1]=[];;
a[3]['qwe3'][1][1]="qqqq2";

НО! Так как элементы массива создаются во вложенных циклах, причем некоторые из
вложенных циклов могут и не отрабатываться вообще, каждый раз элементы будут пересозданы снова и данные будут потеряны.
единственный вариант - выносить создание элемента за пределы массива. Но это как-то некрасиво ;)

Kolyaj 04.05.2010 10:08

Проверяйте существование элемента, в чём проблема

if (!a[3]) {
    a[3] = {};
}

switch001 04.05.2010 10:21

так некрасиво ;)
и вызовет ошибку если a[3]===undefined
в общем решил обойти используя существующие данные, которые уже есть в виде массивов.
просто хотел сделать быстрое сравнение массивов с целью выяснить, какие элементы были
удалены в новой итерации цикла, ячейки содержали бы единицы и при существовании элемента
возвращали бы true в логических операциях. Быстро и компактно.
А так куча сравнений - потеря производительности.
может готовые функции есть какие-нить для реализации такого подхода создания массива?
ведь языком это не запрещено, синтакис не додумали...

Kolyaj 04.05.2010 10:24

Цитата:

Сообщение от switch001
и вызовет ошибку если a[3]===undefined

С чего бы это?

Цитата:

Сообщение от switch001
так некрасиво

Сама ваша структура некрасива, поэтому и код некрасивый.

switch001 04.05.2010 12:13

ошибку вызовет потому, что переменная неопределена
а is not defined
[Break on this error] if (!а[3]) {

и после ошибки код не исполняется.

и в чем некрасивость моей структуры? подскажете красивую структуру?

Kolyaj 04.05.2010 12:20

Цитата:

Сообщение от switch001
ошибку вызовет потому, что переменная неопределена

Переменная-то почему не определена?

Цитата:

Сообщение от switch001
и в чем некрасивость моей структуры?

Ну вы же не можете её красиво создать?

Цитата:

Сообщение от switch001
подскажете красивую структуру?

Нет, я не знаю вашей задачи.


Часовой пояс GMT +3, время: 06:59.