Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.05.2010, 09:23
Интересующийся
Отправить личное сообщение для switch001 Посмотреть профиль Найти все сообщения от switch001
 
Регистрация: 14.04.2010
Сообщений: 29

массивы динамической размерности
привык в 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]);

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

Последний раз редактировалось switch001, 04.05.2010 в 09:30.
Ответить с цитированием
  #2 (permalink)  
Старый 04.05.2010, 09:46
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

Сообщение от switch001
a[1,'qwe1',1,1]="qqqqq";
А что вы этим сказать-то хотели? Ну придумали синтаксис, ну не работает он.

Перед тем, как использовать сущность, нужно её создать.
var a = [];
a[1] = {};
a[1].qwe = [];
// ...
Ответить с цитированием
  #3 (permalink)  
Старый 04.05.2010, 10:06
Интересующийся
Отправить личное сообщение для switch001 Посмотреть профиль Найти все сообщения от switch001
 
Регистрация: 14.04.2010
Сообщений: 29

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

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";

НО! Так как элементы массива создаются во вложенных циклах, причем некоторые из
вложенных циклов могут и не отрабатываться вообще, каждый раз элементы будут пересозданы снова и данные будут потеряны.
единственный вариант - выносить создание элемента за пределы массива. Но это как-то некрасиво
Ответить с цитированием
  #4 (permalink)  
Старый 04.05.2010, 10:08
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

if (!a[3]) {
    a[3] = {};
}
Ответить с цитированием
  #5 (permalink)  
Старый 04.05.2010, 10:21
Интересующийся
Отправить личное сообщение для switch001 Посмотреть профиль Найти все сообщения от switch001
 
Регистрация: 14.04.2010
Сообщений: 29

так некрасиво
и вызовет ошибку если a[3]===undefined
в общем решил обойти используя существующие данные, которые уже есть в виде массивов.
просто хотел сделать быстрое сравнение массивов с целью выяснить, какие элементы были
удалены в новой итерации цикла, ячейки содержали бы единицы и при существовании элемента
возвращали бы true в логических операциях. Быстро и компактно.
А так куча сравнений - потеря производительности.
может готовые функции есть какие-нить для реализации такого подхода создания массива?
ведь языком это не запрещено, синтакис не додумали...
Ответить с цитированием
  #6 (permalink)  
Старый 04.05.2010, 10:24
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

Сообщение от switch001
так некрасиво
Сама ваша структура некрасива, поэтому и код некрасивый.
Ответить с цитированием
  #7 (permalink)  
Старый 04.05.2010, 12:13
Интересующийся
Отправить личное сообщение для switch001 Посмотреть профиль Найти все сообщения от switch001
 
Регистрация: 14.04.2010
Сообщений: 29

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

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

и в чем некрасивость моей структуры? подскажете красивую структуру?
Ответить с цитированием
  #8 (permalink)  
Старый 04.05.2010, 12:20
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

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

Сообщение от switch001
подскажете красивую структуру?
Нет, я не знаю вашей задачи.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы удаление элемента и вставка на его место другого mycoding Общие вопросы Javascript 1 19.04.2010 22:30
GetElementById не хочет работать в динамической форме Игорёk Events/DOM/Window 8 23.06.2009 13:27
Помогите разобраться. Массивы, управляющие структуры и прочее... hadji29 Общие вопросы Javascript 1 23.02.2009 21:17
JS и массивы big Общие вопросы Javascript 4 21.12.2008 14:24
Создание динамической подсказки Макс Элементы интерфейса 6 14.06.2008 23:13