Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Формирование двухмерного массива в javascript (https://javascript.ru/forum/dom-window/16061-formirovanie-dvukhmernogo-massiva-v-javascript.html)

Neokortex 24.03.2011 16:22

Формирование двухмерного массива в javascript
 
Идея такая: нас странице есть список с чекбоксами. Каждый чекбокс имеет атрибуты title и value.

Надо пробежаться по чекбоксам и собрать массив данных, такого вида (привожу пример php, т.к. толком не знаю синтаксис js)
array(
	0=>array('title'=>'тайтл 1-го чекбокса', 'value'=>'содержимое 1-го чекбокса'),
	1=>array('title'=>'тайтл 2-го чекбокса', 'value'=>'содержимое 2-го чекбокса'),
	2=>array('title'=>'тайтл 3-го чекбокса', 'value'=>'содержимое 3-го чекбокса'),
	3=>array('title'=>'тайтл 4-го чекбокса', 'value'=>'содержимое 4-го чекбокса'),
)

Я делаю так:
var allChecked = new Array();
for (var o = checkboxes, j = 0, l = o.length; j < l; j++) {
	if (o[j].checked == true) {
		cTitle = o[j].title;
		//alert(eTitle); 
		cValue = o[j].value;
		//alert(eValue); 
		acl = allChecked.length;
		allChecked[acl] = new Array({'checkbox-value':cValue, 'checkbox-title':cTitle});
	};
};
alert(allChecked[0]); // выводит [object Object]

Результат: [object Object]. Правильно ли я делаю? Может не так надо массив на экран выводить? Или неправильно код работает?

Помогите, пожалуйста.

goldserg 24.03.2011 16:52

Если я правильно понял то у тебя в одномерном массиве, ассоциативный.
В таком случает надо так.
allChecked[acl] = {'checkbox-value':cValue, 'checkbox-title':cTitle};

Т.к. в JS нет ассоциативных массивов, из заменяют объекты.
А алерт все правильно тебе выводит и будет выводить тоже самое после изменения.
alert(allChecked[0]['checkbox-value']);

так должен выводить значение

Neokortex 24.03.2011 17:04

спасибо большое. работает.
А как можно вывести на экран весь массив?

Skipp 24.03.2011 17:23

goldserg,
в js вообще можно сказать нету массивов, массив это тот же объект.

Neokortex,
это как пример
<input type="button" onclick="show()" value="нажми">
<input type="checkbox" title="t1">
<input type="checkbox" title="t2">
<input type="checkbox" title="t3">
<input type="checkbox" title="t4">
<input type="checkbox" title="t5">
<input type="checkbox" title="t6">
<input type="checkbox" title="t7">
<input type="checkbox" title="t8">
<input type="checkbox" title="t9">

<div id="out"></div>

<script type="text/javascript">
	function gc(inO){
		var inputs = inO.getElementsByTagName("input"), newinputs = new Array();
		for(var i in inputs) if(inputs[i].type == "checkbox") newinputs.push([inputs[i].checked, inputs[i].title]);
		return newinputs;
	}
	function show(){
		result = gc(document.body), str="";
		for(var i in result) str += i + " = " + result[i];
		document.getElementById('out').innerHTML = str;
	}
	
</script>

goldserg 24.03.2011 17:26

либо по циклу перебором, либо подключить функцию, которая конвертит в JSON, либо firebug в FF - что удобнее всего и быстрее

goldserg 24.03.2011 17:28

Цитата:

Сообщение от Skipp
в js вообще можно сказать нету массивов, массив это тот же объект.

Я в курсе. Но конструктор у него отличается.

Skipp 24.03.2011 17:30

goldserg,
Цитата:

конвертит в JSON
это как?
JSON - это просто синтаксис для представления объекта
в браузере компилятор его уже знает.
{a:1, b:2, c:3} - это объект, а синтаксис JSON

Skipp 24.03.2011 17:34

Цитата:

Сообщение от goldserg
Но конструктор у него отличается.

ну конечно только он как был объектом так и остался
alert(typeof [])

goldserg 24.03.2011 17:37

Да я и не спорю
alert(Object.prototype.toString.call([1,2]).match(/\w+(?=])/)[0])


А насчет JSON - так это чтобы алертом строку вывести, библиотека либо JSON.stringlify (IE8+, все остальные браузеры) позволяет это сделать, а затем вывести алертом например содержимое.

Skipp 24.03.2011 17:51

но всё равно это сначала
alert(Object.prototype.toString.call([1,2]).match(/\w+/))


и так можно, но не во всех браузерах
alert({a:1,b:2}.toSource())


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