Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Многомерный массив javascript (https://javascript.ru/forum/misc/12082-mnogomernyjj-massiv-javascript.html)

simple 29.09.2010 17:57

Многомерный массив javascript
 
Нужна помощь, есть некий массив, например: a [1,2,3,4,5,6,7,8,9], нужно элементы этого массива залить в двухмерный массив, чтобы было так:
b[0]=[1,2,3]
b[1]=[4,5,6]
b[2]=[7,8,9]

и чтобы обращения к массиву было в духе b[0][1], выводит 2.

exec 29.09.2010 18:03

<script type="text/javascript">
Array.prototype.to2x = function () {
	var temp = [];
	for ( var i = 0; i < this.length; i += 3 ) {
		temp.push(this.slice(i, i + 3));
	}
	return temp;
};

var t = [  0,1,2,3,4,5,6,7,8  ].to2x();
alert(  t[0] + '; ' +  t[1] + '; ' + t[2]  );
</script>

simple 29.09.2010 18:15

Большое человеческое спасибо! а как сделать чтобы это было динамически, т.е предпологается что скрипт незнает точно какого размера будет первый массив?

DooMer 29.09.2010 18:24

с помощью length получаешь длинну массива, а потом вспоминаешь математику

exec 29.09.2010 18:29

simple, там и так массив любой длины разбивается на подмассивы по 3 элемента.

Sweet 29.09.2010 19:40

Цитата:

Сообщение от simple
а как сделать чтобы это было динамически

Пожалуйста: метод возвращает квадратный двумерный массив.
Array.prototype.to2x = function(){ 
  var x = arguments[0] ? Math.ceil(Math.sqrt(this.length)) : Math.floor(Math.sqrt(this.length)), result = [];
  for( var i = 0; i < x; i++ ) result.push([]);
  for( var i = 0; i < x*x; i++ ){
    var a = i==0 ? 0 : Math.floor(i/x), 
    b = i==0 ? 0 : i%x;
    result[a][b] = this[i];
  } 
  return result;
};
var temp1 = [1, 2, 3, 4, 5].to2x();
alert(temp1[0]+'; '+temp1[1]);
var temp2 = [1, 2, 3, 4, 5].to2x(true);
alert(temp2[0]+'; '+temp2[1]+'; '+temp2[2]);

simple 29.09.2010 20:25

Вобщем сделал по своему, в ассоциативный массив...
<script>
a=0;
var mas=[];
    y=[1000,1,123,2000,20,321,3000,33,455];
for(i=0;i<=y.length/3;i++){
mas[y[a]]=new Array(y[1+a],y[2+a]);
a=a+3;
}
</script>


Не могу найти инфу по сортировке и перебору по ключам как в PHP. В JS это возможна? Помогите пожалуйста, очень надо :help:

Sweet 29.09.2010 21:50

Все что надо есть здесь

simple 30.09.2010 10:43

Всем спасибо за помощь, появился еще один вопрос по поводу массивов...
for(i=0;i<mas.length;i++){
....
pr['Moscow']+=mas[i];
....
alert('Moscow');

Задумано цикле из массива mas[] создать ассоциативный массив pr[], но алерт пишет NaN... в чем ошибка? :-?

Sweet 30.09.2010 11:01

Цитата:

Сообщение от simple
ассоциативный массив pr[]

Я надеюсь pr - объект, а не массив?!
Я так понял хотелось чего-то тип того:
var mas=[1,2,3], pr={};
pr.Moscow = mas;
alert(pr.Moscow)
???

Kolyaj 30.09.2010 11:36

Цитата:

Сообщение от simple
создать ассоциативный массив pr[]

http://alljs.ru/articles/array/whatis.html#assoc

Теперь, когда у вас pr объект, а не массив: а вы pr['Moscow'] инициализируете нулём предварительно?

simple 30.09.2010 12:57

Цитата:

Сообщение от Kolyaj (Сообщение 72469)
http://alljs.ru/articles/array/whatis.html#assoc

Теперь, когда у вас pr объект, а не массив: а вы pr['Moscow'] инициализируете нулём предварительно?

нет не инициализировал, но проблема в принципе решена в обход, всем спасибо за помощь :)

poorking 02.11.2010 13:46

exec,
Цитата:

Сообщение от exec (Сообщение 72382)
<script type="text/javascript">
Array.prototype.to2x = function () {
	var temp = [];
	for ( var i = 0; i < this.length; i += 3 ) {
		temp.push(this.slice(i, i + 3));
	}
	return temp;
};

var t = [  0,1,2,3,4,5,6,7,8  ].to2x();
alert(  t[0] + '; ' +  t[1] + '; ' + t[2]  );
</script>

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

И у меня тоже вопрос похожего характера. У меня есть строка битов(string), длина ее 128. И ее нужно преобразовать в квадратный массив [4]x[4]. То бишь по 8 бит в ячейке. Чтобы сделать вашим способом, мне нужно сначала строку преобразовать в одномерный массив, по 8 бит на элемент, а затем только делать эти преобразования? Не подскажите какие есть варианты? можно ли сразу делать присвоение типа array[i][j]=значение внутри цикла со счетчиком j, который вложен соответственно в цикл со счетчиком i?

vladlen 02.11.2010 14:26

С одной стороны строка это как-то глупо :) С другой число 128 бит, многовато для сдвига. Чтобы не думать разорвать строку на одномерный массив по 8 символов, пройтись по элементам преобразовав их в числа и применить выше описанную функцию.

poorking 02.11.2010 14:54

vladlen,
Дело в том что в основную функцию попадает текст, преобразующийся потом в двоичный вид, и обрабатываемый в последствии кусками по 128 бит. Думаете, хранить весь исходный двоичный текст, а он, например, на полмегабайта в массиве(элемент=1бит)?:blink:

Или только 128-битные блоки? Я не знаю как лучше, просто мне кажется, что если длинные массивы крутить в циклах, очень медленно работать будет, там ведь еще куча преобразований

vladlen 02.11.2010 16:50

Вы задачу нормально опишите, а то тут какой-то текст приплели.

poorking 02.11.2010 17:13

vladlen,
В функцию попадает текст, например value какого нибудь textarea. Там он кодируется в двоичный вид. Затем рвется на куски по 128бит и вот этот 128 бит кусок нужно скопировать в квадратный массив 4х4 по 8 бит в ячейке.
Сначала был вопрос как это сделать если у меня двоичный код хранится в string. Вы мне посоветовали хранить двоичный код в массиве, вот я и спросил, все ли будет ок если я длиннющий бинарный код буду держать в массиве? Я думал что будет долго работать, но все нормально. Спасибо за совет:)

Теперь я без проблем могу разбить 128битные блоки на массив 4х4, правда массив получится вида
[[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],
[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],
[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],
[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]]

poorking 02.11.2010 19:10

Нет, не без проблем:D Подскажите пожалуйста, как мне одномерный массив битов преобразовать в квадратный массив вида как изобразил выше:(

poorking 02.11.2010 20:34

Я сделал вот так, в несколько ходов, хотелось бы конечно покрасивше:(

input - одномерный массив битов.
tInp - временный массив, в который возвращаю преобраованный input, потом обратно в input возвращаю его значение.
И только потом получил массив state, такой который хотел. Вобщем абракадабра.:(

byteLen=8;


for (var j=0; j<input.length;j+=byteLen) tInp.push(input.slice(j, j+byteLen));
input = tInp;
			
for (var r=0; r<4;r++) state.push(input.slice(r*input.length/4, r*input.length/4+input.length/4));

poorking 02.11.2010 21:57

Все, проблема решена) нашел хорошую шпаргалку как создавать многомерный массив, причем таких этажей сколько угодно можно сделать. Просто. Не знаю почему не доходило...

var a=new Array ();
for (i = 0; i < rows; i++)    {
		a[i]=new Array ();

		for (j = 0; j < cols; j++)	{
			a[i][j] = value;
		}
}

vladlen 03.11.2010 02:11

Цитата:

Сообщение от poorking (Сообщение 77071)
[[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],
[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],
[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]],
[[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0]]]

Честно, не хочу вникать в то, что вы делаете, но если это конечная структура, то спешу вас огорчить: это не массив байтов, а массив целочисленных элементов. Иными словами, вы каждые 16 бит данных преобразовали в 64 бита.
Мать моя женщина! :blink: Очередной раз в стандарт глянул :)
Чтобы это исправить надо сделать следующее:
var a= [];
for (i = 0; i < rows; i++)    {
  a[i]= [];
  for (j = 0; j < cols; j++) a[i][j] = !!value; /* альтернативный вариант value & true */
}

Теперь у вас действительно байты. Но на этом счастье не закончилось.
На каждый массив в куче выделяется блок в 4К (наверное, зависит от реализации), при достижении порогового значения выделяется еще один блок, при этом весь массив перезаписывается чтобы избежать фрагментации. (ПАРАНОЙЯ :blink:)
К чему я все это? Да не проще все в одномерный массив загнать и с ним работать?
Но в вашем случае, вероятнее всего, лучшим массивом является сама строка.


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