Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите найти красивое решение (https://javascript.ru/forum/misc/14642-pomogite-najjti-krasivoe-reshenie.html)

nel15 24.01.2011 14:42

Помогите найти красивое решение
 
Есть глобальный массив
var mass = new Array();

Есть первая функция
functıon func1(){
    for(var i = 0; i < anynum; i++){
        mass[somekey1] = new Array();
        mass[somekey1][somekey2] = somevalue;
    }
}

И вторая
function func2(){
    alert(mass[somekey1][somekey2]);
}

Это пример. Проблема в том, что вторая функция выводит undıfıed, т.к. первая функция забивает глобальный массив только ссылками на массивы, которые уничтожаются в конце тела первой функции. Проблема была бы решена если бы в js можно было заранее создать двумерный ассоциативный массив, а заранее задавать размеры тоже не годится, т.к. неизвестно количество элементов

Kolyaj 24.01.2011 14:46

Цитата:

Сообщение от nel15
т.к. первая функция забивает глобальный массив только ссылками на массивы, которые уничтожаются в конце тела первой функции

Ничего не удаляется.

Не перебарщивайте с глобальными переменными.

Не используйте массивы, как ассоциативные.
http://alljs.ru/articles/array/
В частности http://alljs.ru/articles/array/whatis.html#assoc

nel15 24.01.2011 14:53

В твоем учебнике, пока, что только прочитал, и убедился в своих словах

Но не забывайте, что это всё-таки не многомерный массив, а массив массивов. В чём разница: двумерный массив, как частный случай многомерного, это матрица MxN, т.е., грубо говоря, таблица, из M строк и N столбцов. В каждой строке у неё одинаковое количество элементов, равно как и в каждом столбце. В JavaScript иначе, тут в массиве верхнего уровня лежат ссылки на другие произвольные массивы. Они могут быть одинакового размера, могут быть разного, а могут быть вообще не массивами. Многомерный массив — это нечто целое, массив массивов — это множество различных массивов, ссылки на которые лежат ещё в одном массиве.

И для решения моих задач нужен многомерный ассоциативный массив

Kolyaj 24.01.2011 14:56

Я не знаю, в чём вы убедились, но читаете вы как-то плохо. Непонятно, в чём вы меня пытаетесь убедить.

Ассоциативный массив в JS называется объектом. Не надо для него создавать массив.

nel15 24.01.2011 15:08

Каким образом, вы предлагаете мне это написать. Если вторая функция выводит результат работы первой, которая неизвестно количество раз добавляет в глобальный массив массивы неизвестной длины.

Kolyaj 24.01.2011 15:10

Не называйте хэши массивами, в JS это не одно и то же, вы только себя запутываете.

У хэшей нет свойства, отражающего количество элементов в нём.

Цитата:

Сообщение от nel15
Каким образом, вы предлагаете мне это написать.

Я не знаю, что вам нужно написать.

nel15 24.01.2011 15:12

Кстати, если на область памяти указывает глобальный массив, то эти подмассивы же не должны очищаться в конце тела первой функции?

Kolyaj 24.01.2011 15:17

Нет никаких областей памяти на уровне языка. Объекты не удаляются, пока на них существует хоть одна ссылка.

nel15 24.01.2011 15:23

Я пишу файловый менеджер, первая функция считывает часть древовидной структуры в виде xml и забивает это в многомерный массив, после чего с помощью второй функции и других функций я хочу работать с этим массивом, канешно, сейчас я могу скачать другие файловые менеджеры, посмотреть как у них там все устроено, но если бы этот маленький пример решился я бы мог все доделать без изменения всего кода

Kolyaj 24.01.2011 15:25

Цитата:

Сообщение от nel15
после чего с помощью второй функции и других функций я хочу работать с этим массивом

А проблема в чём, кроме того, что вы работаете с объектом, а не с массивом?

nel15 24.01.2011 15:29

Проблема в том, что вторая функция не пишет [object], а пишет undefıed

nel15 24.01.2011 15:36

Извините, за потраченное время, попробовал по другому, объект нашелся, большое спасибо, вам плюсик, тема закрыта

Ren 18.06.2012 17:48

Цитата:

Сообщение от nel15 (Сообщение 89447)
Извините, за потраченное время, попробовал по другому, объект нашелся, большое спасибо, вам плюсик, тема закрыта

Столкнулся с похожей ситуацией, не подскажите как правильно это делать? Или вы вообще ушли от такой постановки?

Dim@ 18.06.2012 19:21

Ren,
что именно у вас не так (если просто проблема с массивами массивов то вот пример):
function fun(){
 document.a = prompt('Введите длину массива mass.','');
 document.a2 = prompt('Введите длину массивов массива mass.','');
 if (/\d+(\.\d+)?/.test( document.a) != true){fun();return}
 if (/\d+(\.\d+)?/.test( document.a2) != true){fun();return}
 document.a = new Number( document.a);
 document.a2 = new Number( document.a2);
 document.mass = new Array();
 for (i = 0; i < document.a; i++){
 document.mass[i] = new Array();
  for (k = 0; k < document.a2; k++){
   document.mass[i][k] = Math.round((k + 40) * Math.random());
  }
 }
 func();
}
function func(){
 document.a3 = prompt('Введите индекс элемента массива mass.','');
 document.a4 = prompt('Введите индекс элемента массива массива mass.','');
 document.a3 = new Number(document.a3);
 document.a4 = new Number(document.a4);
 if ((/\d+(\.\d+)?/.test(document.a3) != true) || (document.a3 >= document.a)){func();return}
 if ((/\d+(\.\d+)?/.test(document.a4) != true) || (document.a4 >= document.a2)){func();return}
 alert(document.mass[document.a3][document.a4]) 
}
fun();

Deff 18.06.2012 19:42

Цитата:

Сообщение от nel15
заранее создать двумерный ассоциативный массив, а заранее задавать размеры тоже не годится, т.к. неизвестно количество элементов

Простое решение - создавать массив
В котором первый элемент содержит длину подмассива, а второй -уже указатель, Элементы с нулевой длиной периодически удаляются чистильщиком по таймеру

drstas 23.08.2012 23:45

Двух мерный массив
 
Лучшее решение создать собственный оператор массивов, точнее контейнер
вот пример
function vector()
	{
		this.begin=null;
  		this.end=null;
  		this.zn=null;
  		this.size=function(){var s=0;this.zn=this.begin;while(this.zn!=null){s++;this.zn=this.zn.end;}return s;}
  		this.add_back=function(buff){this.zn=new vector();this.zn.begin=this.end;this.zn.end=null;this.zn.zn=buff;if(this.end==null)this.begin=this.zn;else this.end.end=this.zn;this.end=this.zn;}  		
  		this.add_front=function(buff){this.zn=new vector();this.zn.begin=null;this.zn.end=this.begin;this.zn.zn=buff;if(this.begin==null)this.end=this.zn;else this.begin.begin=this.zn;this.begin=this.zn;}
  		this.add=function(pos,buff){if(pos<=0)this.add_front(buff);else if(pos>=this.size())this.add_back(buff);else{this.zn=new vector();var q=this.begin;while(pos!=0){q=q.end;pos--;}this.zn.begin=q.begin;this.zn.end=q;this.zn.zn=buff;q.begin.end=this.zn;q.begin=this.zn;}}
		this.del_front=function(){if(this.begin!=null){this.zn=this.begin.end;delete this.begin;this.begin=this.zn;}}			
		this.del_back=function(){if(this.begin!=null){this.zn=this.end.begin;delete this.end;this.end=this.zn;}}		
		this.del=function(pos){if(pos<=0)this.del_front(buff);else if(pos>=this.size()-1)this.del_back(buff);else{this.zn=this.begin;while(pos!=0){this.zn=this.zn.end;pos--;}this.zn.begin.end=this.zn.end;this.zn.end.begin=this.zn.begin;delete this.zn;}}	
		this.front=function(){if(this.begin!=null)return this.begin.zn;else return null;}			
		this.back=function(){if(this.begin!=null)return this.end.zn;else return null;}				
		this.insert=function(pos){if(pos<0)return null;this.zn=this.begin;while(pos!=0){if(this.zn==null)return null;else{this.zn=this.zn.end;pos--}}return this.zn.zn;}	
		this.clear=function(){while(this.begin!=null){this.zn=this.begin.end;delete this.begin;this.begin=this.zn;}}
	}
	function matrix()
	{
		this.it=new vector();
		this.line_size=function(){return this.it.size();} 		
		this.col_size=function(pos){return this.it.insert(pos).size();} 
		this.add_line=function(pos){this.it.add(pos,new vector());}				
		this.add_line_front=function(){this.it.add_front(new vector());}
		this.add_line_back=function(){this.it.add_back(new vector());}	
		this.del_line=function(pos){if(this.it.insert(pos)!=null){this.it.insert(pos).clear();delete this.it.insert(pos);this.it.del(pos);}}		
		this.del_line_front=function(){if(this.it.begin!=null){this.it.front().clear();delete this.it.front();this.it.del_front();}}	
		this.del_line_back=function(){if(this.it.end!=null){this.it.back().clear();delete this.it.back();this.it.del_back();}}
		this.add_col=function(posx,posy,zn){this.it.insert(posx).add(posy,zn);}	
		this.add_col_front=function(posx,zn){this.it.insert(posx).add_front(zn);}
		this.add_col_back=function(posx,zn){this.it.posx,posy.add_back(zn);}	
		this.del_col=function(posx,posy){this.it.insert(posx).del(posy);}
		this.del_col_front=function(posx){this.it.insert(posx).del_front();}			
		this.del_col_back=function(posx){this.it.insert(posx).del_back();}
		this.insert=function(posx,posy){return this.it.insert(posx).insert(posy);}
		this.clear=function(){while(this.it.begin!=null)this.del_line_front();}
	}

тем самым мы получаем оператор двумерный массив Matrix()

var kon=new matrix(); // создаем двумерный массив
\\.............работаем с ним
kon.clear(); // очищаем массив освобождая память
delete kon;


оператор matrix() имеет команды (функции)
работа с массивом первого уровня:
line_size() - возвращает количество строк (x.length)
add_line(pos) - создает пустой массив 2 уровня в позицию pos (x[pos]=new Array())
add_line_front() - тоже что и add_line(pos), но добавляет в начале массива (x[0]=new Array())
add_line_back() - тоже что и add_line(pos), но добавляет в конец массива (x[x.length]=new Array())
del_line(pos) - удалить строку в позицию pos
соответственно
del_line_front() удалить в начале,
del_line_back() удалить в конце

работа с массивом второго уровня:
col_size(pos) - возвращает количество значений в pos строке
add_col(posx,posy,zn) - добавить значение zn в строку posx, в позицию posy ( x[posx][posy]=y )
add_col_front(posx,zn) - добавить значение zn в строку posx, в начало массива 2 уровня ( x[posx][0]=y )
add_col_back(posx,zn) соответственно добавить в конец массива
del_col(posx,posy) - удалить из строки posx и значение posy
del_col_front(posx) - удалить из строки posx в начале строки
del_col_back(posx) - удалить из строки posx в конце строки

и самое главное чтение значения
insert(posx,posy) - читаем, изменяем значение posy в строке posx (x[posx][posy]=z)

clear() - очищаем массивы


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