Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Создание многомерного массива (https://javascript.ru/forum/dom-window/70806-sozdanie-mnogomernogo-massiva.html)

al456 04.10.2017 00:18

Создание многомерного массива
 
Возникла проблема при заполнении многомерного массива, теряются значения во вложенных массивах. Портянку кода сократил на сколько возможно.... Пробую описать суть проблемы. Есть "Данные для заполнения массива". После загрузки страницы пробую сформировать двумерный массив, ожидаю получить "Ожидаемый результат". По факту получается "Полученный результат" - пропадают на втором уровне все значения, кроме последних.
Самого реального, проблемного кода - строк 10, смотреть проще тут: http://jsbin.com/radikacofi/edit?html,output
ХЗ на javascript.ru код не запускается полностью, по ссылке - все работает ( вернее запускается, но результат печальный(((()
HELP:help: :(

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>ПРИМЕР-Вопрос</title>
	<script src="http://code.jquery.com/jquery-3.1.1.min.js"  integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="  crossorigin="anonymous"></script>
</head>

	<body class="">

<div id="sortingBTN">
<h2>Данные для заполнения массива</h2>
	<h3>Срок поставки</h3>
		<input type='checkbox' data-parametr='available' data-value='1' class='parametrSortingJS' > 1<i> всего 210 объектов</i><br>
		<input type='checkbox' data-parametr='available' data-value='2' class='parametrSortingJS' > 2<i> всего 126 объектов</i><br>
		<input type='checkbox' data-parametr='available' data-value='3' class='parametrSortingJS' > 3<i> всего 429 объектов</i><br>
		<input type='checkbox' data-parametr='available' data-value='empty((' class='parametrSortingJS' > empty((<i> всего 3 объектов</i><br>

	<h3>Цветовая гамма</h3>
		<input type='checkbox' data-parametr='color' data-value='empty((' class='parametrSortingJS' > empty((<i> всего 325 объектов</i><br>
		<input type='checkbox' data-parametr='color' data-value='3' class='parametrSortingJS' > 3<i> всего 179 объектов</i><br>
		<input type='checkbox' data-parametr='color' data-value='5' class='parametrSortingJS' > 5<i> всего 32 объектов</i><br>
		<input type='checkbox' data-parametr='color' data-value='4' class='parametrSortingJS' > 4<i> всего 173 объектов</i><br>
		<input type='checkbox' data-parametr='color' data-value='2' class='parametrSortingJS' > 2<i> всего 55 объектов</i><br>
		<input type='checkbox' data-parametr='color' data-value='1' class='parametrSortingJS' > 1<i> всего 4 объектов</i><br>

</div>

<script>
	// проблема START
	$(function() 
	{
		var arrData = [];
		$('#sortingBTN input.parametrSortingJS').each(function(indxInput, elementInput)
		{	//	Собираем пары параметр/значение
			parametr = $(elementInput).data('parametr');
			value = $(elementInput).data('value');	
			if( arrData.indexOf( parametr ) == -1 )
			{	//	нет ключа в массиве, создаем
				arrData[parametr] = [];
			}
			if( arrData[parametr].indexOf( value ) == -1 )
			{	//	нет ключа в массиве, создаем, заполнякм
				arrData[parametr][value] = 0;
			}			
		});
		$('#control').html(print_r( arrData, 0, 1 ));
	});
	// Проблема END
	
	function print_r(arr, level, html) 
		{	//	Контрольный вывод массива
			if(!html) lt = "\n"; else lt = "<br>";
			var print_red_text = "";
			if(!level) level = 0;
			var level_padding = "";
			for(var j=0; j<level+1; j++) level_padding += " &nbsp; &nbsp; ";
			if(typeof(arr) == 'object') {
				for(var item in arr) {
					var value = arr[item];
					if(typeof(value) == 'object') {
						print_red_text += level_padding + "'" + item + "' :" + lt;
						print_red_text += print_r(value,level+1, html);
			}
					else
						print_red_text += level_padding + "'" + item + "' => \"" + value + "\"" + lt;
				}
			}

			else  print_red_text = "===>"+arr+"<===("+typeof(arr)+")";
			return print_red_text;
		}
</script>
<div style="color:green">
	<h2>Полученный результат</h2>
	<div id="control"></div>
</div>
<h2>Ожидаемый результат:</h2>
['available']<br>
 &nbsp; &nbsp; ['1'] = 0<br>
 &nbsp; &nbsp; ['2'] = 0<br>
 &nbsp; &nbsp; ['3'] = 0<br>
 &nbsp; &nbsp; ['empty(('] = 0<br>
['color']<br>
 &nbsp; &nbsp; ['empty(('] = 0<br>
 &nbsp; &nbsp; ['3'] = 0<br>
 &nbsp; &nbsp; ['5'] = 0<br>
 &nbsp; &nbsp; ['4'] = 0<br> 
 &nbsp; &nbsp; ['2'] = 0<br>
 &nbsp; &nbsp; ['1'] = 0<br> 
 
	</body>
</html>

рони 04.10.2017 00:29

al456,
для начала может
var arrData = {}; и что такое ноль ['1'] = 0?

al456 04.10.2017 00:37

var arrData = {}; - типо перейти на обьекты??? - локально пробую
['1'] = 0 Это присвоенное значение Line44: arrData[parametr][value] = 0;

al456 04.10.2017 00:47

Вопрос закрыт, как всегда - СПАСИБО РОНИ!!!!

По сути - перешел на обьекты - все заработало, долблюсь дальше

рони 04.10.2017 00:52

al456,
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>ПРИМЕР-Вопрос</title>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"  ></script>
</head>

  <body class="">

<div id="sortingBTN">
<h2>Данные для заполнения массива</h2>
  <h3>Срок поставки</h3>
    <input type='checkbox' data-parametr='available' data-value='1' class='parametrSortingJS' > 1<i> всего 210 объектов</i><br>
    <input type='checkbox' data-parametr='available' data-value='2' class='parametrSortingJS' > 2<i> всего 126 объектов</i><br>
    <input type='checkbox' data-parametr='available' data-value='3' class='parametrSortingJS' > 3<i> всего 429 объектов</i><br>
    <input type='checkbox' data-parametr='available' data-value='empty((' class='parametrSortingJS' > empty((<i> всего 3 объектов</i><br>

  <h3>Цветовая гамма</h3>
    <input type='checkbox' data-parametr='color' data-value='empty((' class='parametrSortingJS' > empty((<i> всего 325 объектов</i><br>
    <input type='checkbox' data-parametr='color' data-value='3' class='parametrSortingJS' > 3<i> всего 179 объектов</i><br>
    <input type='checkbox' data-parametr='color' data-value='5' class='parametrSortingJS' > 5<i> всего 32 объектов</i><br>
    <input type='checkbox' data-parametr='color' data-value='4' class='parametrSortingJS' > 4<i> всего 173 объектов</i><br>
    <input type='checkbox' data-parametr='color' data-value='2' class='parametrSortingJS' > 2<i> всего 55 объектов</i><br>
    <input type='checkbox' data-parametr='color' data-value='1' class='parametrSortingJS' > 1<i> всего 4 объектов</i><br>

</div>

<script>
  // проблема START
  $(function()
  {
    function fn()
    {
       var obj = {};
     $("[data-parametr]").each(function(indx, el){
           var data = $(el).data(),
           parametr = data.parametr;
           parametr = obj[parametr]||(obj[parametr]={});
           parametr[data.value] = +el.checked
     });
    $('#control').html( JSON.stringify(obj,"",4));
    };
    fn()
    $("[data-parametr]").on({click : fn})
  });

</script>
<div style="color:green">
  <h2>Полученный результат</h2>
  <div id="control"></div>
</div>
<h2>Ожидаемый результат:</h2>
['available']<br>
 &nbsp; &nbsp; ['1'] = 0<br>
 &nbsp; &nbsp; ['2'] = 0<br>
 &nbsp; &nbsp; ['3'] = 0<br>
 &nbsp; &nbsp; ['empty(('] = 0<br>
['color']<br>
 &nbsp; &nbsp; ['empty(('] = 0<br>
 &nbsp; &nbsp; ['3'] = 0<br>
 &nbsp; &nbsp; ['5'] = 0<br>
 &nbsp; &nbsp; ['4'] = 0<br>
 &nbsp; &nbsp; ['2'] = 0<br>
 &nbsp; &nbsp; ['1'] = 0<br>

  </body>
</html>

al456 04.10.2017 01:01

Спасибо за ответ, доблюсь, вникаю, разбираюсь


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