Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Добавление данных в массив (https://javascript.ru/forum/events/65931-dobavlenie-dannykh-v-massiv.html)

Batyabest 16.11.2016 11:51

Добавление данных в массив
 
Добрый день.
Есть форма, вот ее основной блок, таких блоков несколько, различаются они только значением input с классом osnova (Программа 1, программа 2 и т.д.)

<div class="progblock">
<label class="bold_name"><input type="checkbox" name="public" class="public osnova" value="Программа 1" > Программа 1</label>

<div class="napravlenie hides" style="display:none;">
		<div class="checkbox col-xs-6 forma_obuchen">
            <select name="ot_forma1" class="form-control">
                           <option value="">Форма обучения</option>
			   <option value="Очная">Очная</option>
			   <option value="Дистанционная">Дистанционная</option>
			</select>
        </div>
		<div class="checkbox col-xs-6 kolvo_uchenik">
		<input type="number" name="ot_kolvo1" value="" class="form-control" placeholder="Число слушателей">
        </div>
		</div>
<div class="clearfix"></div>
</div>
<a href="#" class="podtv">Заполнить форму</a>



Снизу есть ссылка - Заполнить форму - по нажатию которой мне нужно собрать все выбранные пользователем checkbox (их значения) и значения, выбранные в соответствующих полях под этим чекбоксом (форма обучения и число слушателей).

Данные выбранных чекбокосов я забиваю в массив таким методом:
var arr=$('input:checkbox:checked').map(function() {return this.value;}).get();

А вот как мне в массив добавить остальные данные? Получается мне нужно создать многомерный массив, где будут данные:
array {
[0] = Array {
                 [0] = Программа 1
                 [1] = Дистанционная
                 [2] = 5
                 }
[1] = Array {
                 [0] = Программа 1
                 [1] = Очная
                 [2] = 10
                 }
...
}

ksa 16.11.2016 12:22

Цитата:

Сообщение от Batyabest
Получается мне нужно создать многомерный массив

Можно сделать массив объектов...

var arr=[
   {
      name: 'Программа 1',
      type: 'Дистанционная',
      val: 5
   },
   {
      name: 'Программа 1',
      type: 'Очная',
      val: 10
   }
]

Batyabest 16.11.2016 12:31

Цитата:

Сообщение от ksa (Сообщение 435162)
Можно сделать массив объектов...

var arr=[
   {
      name: 'Программа 1',
      type: 'Дистанционная',
      val: 5
   },
   {
      name: 'Программа 1',
      type: 'Очная',
      val: 10
   }
]

А как мне вместо значения добавлять туда только те значения Программ, чекбоксы которых отмечены? То есть выбрал пользователь программу 1, выбрал форму обучения Дистанционную, количество слушателей выбрал 5 - вот я это вижу в массиве.

рони 16.11.2016 12:35

Batyabest,
var arr=$.map($('input:checkbox:checked'),function(el) {
var parent = $(el).parents('.progblock');
return [el.value, $('select',parent).val(), $('[type="number"]',parent).val()]});

ksa 16.11.2016 12:37

Цитата:

Сообщение от Batyabest
А как мне вместо значения добавлять туда только те значения Программ, чекбоксы которых отмечены?

Читай нужные данные... Проверяй... Формируй массив...

Batyabest 16.11.2016 12:52

Цитата:

Сообщение от рони (Сообщение 435166)
Batyabest,
var arr=$.map($('input:checkbox:checked'),function(el) {
var parent = $(el).parents('.progblock');
return [el.value, $('select',parent).val(), $('[type="number"]',parent).val()]});

Спасибо, в принципе то, что нужно. Но он все кидает в массив по порядку, название, форма обучения, количество и т.д. А можно ли именно в многомерный массив складывать?
Я сейчас попытаюсь объяснить что мне в итоге нуджно, а Вы подскажите, как легче сделать.
Эти данные в дальнейшем отправляются в модальное окно в котором есть форма (имя, телефон и т.д.) А значения полей просто снизу выводится списком должны:
Наименование: Программа 1
Форма обучения: Дистанционная
Количество: 5 человек

Наименование: Программа 2
Форма обучения: Очная
Количество: 17 человек

Далее человек заполнив форму жмет "Отправить" и уходит на почту уже и данные формы и данные выбранных на первом этапе полей.

рони 16.11.2016 13:06

Batyabest,
var arr= [].map.call($('input:checkbox:checked'),function(el) {
var parent = $(el).parents('.progblock');
return {'Наименование' : el.value, 'Форма обучения' : $('select',parent).val(), 'Количество' : $('[type="number"]',parent).val()}});
alert(JSON.stringify(arr, null, 4))

Batyabest 16.11.2016 13:25

Цитата:

Сообщение от рони (Сообщение 435173)
Batyabest,
var arr= [].map.call($('input:checkbox:checked'),function(el) {
var parent = $(el).parents('.progblock');
return {'Наименование' : el.value, 'Форма обучения' : $('select',parent).val(), 'Количество' : $('[type="number"]',parent).val()}});
alert(JSON.stringify(arr, null, 4))

Сейчас то что нужно. Получилась JSON строка?
А как мне ее разобрать чтобы вывести в модальном окне?
Свой массив одномерный я так разбирал:
for (var index in arr)	{
	    	for (var mass in index )
	   $('.proverka_programm').append('<li>' + arr[mass] + '</li>');
	   $("#myModal").show("slow");
	}


А тут как быть?
JSON.parse() возвращает массив из объектов, как быть далее?

Batyabest 25.11.2016 11:10

Цитата:

Сообщение от рони (Сообщение 435173)
Batyabest,
var arr= [].map.call($('input:checkbox:checked'),function(el) {
var parent = $(el).parents('.progblock');
return {'Наименование' : el.value, 'Форма обучения' : $('select',parent).val(), 'Количество' : $('[type="number"]',parent).val()}});
alert(JSON.stringify(arr, null, 4))

Рони, помоги)))
Как мне подвязать валидацию полей, которые вложены в чекбоксы?
Пытаюсь так подвязаться, но он выдет сообщение об ошибке, но функция продолжает далее работать. В результате я в модельном окне вижу только те данные, которые заполнены правильно. А как вообще прервать выполнение скрипта и не показывать модалку?

var arr= [].map.call($('input:checkbox:checked'),function(el) {
		var parent = $(el).parents('.progblock');
		if ($('select',parent).val() == '') {
	alert('Выберите форму обучения!');
	return;
		}
		else if ($('[type="number"]',parent).val() == '') {
	alert('Введите количество слушателей!');
	return;
		}
		else {
		return {
			'name' : el.value, 
			'type' : $('select',parent).val(), 
			'val' : $('[type="number"]',parent).val()
			}
		}
		});


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