| 
	| 
	
	| 
		
	| 
			
			 
			
				22.07.2012, 15:53
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 22.07.2012 
						Сообщений: 1
					 
		
 |  |  
	| 
				JS Перебор ассоциативного многомерного массива
			 Подскажите пож есть ли возможность перебрать многомерный ассоциативный массив внутри функции JS. Массив уже находится внутри функции. Может у кого примерчик есть? В массиве 4 уровня вложености masiv['lev1']['lev2']['lev3']['lev4']. Прочитал что для ассоциативных массивов существует структура JS for in , только с помощью нее у меня получилось вывести первый уровень массива. И то написало не список значений во втором уровне, а просто "OBJECT". Выглядел скрипт вот так:
 for (var Name in my_array) {
 // Переменной Name на каждой итерации присваивается
 // строка-индекс ассоциативного массива
 document.write(Name + " = " + my_array[Name] + "<br>");
 }
 
 Подскажите пож как сделать что-то подобное перебрать массив и заодно выполнить действия при переборе. Ну с действиями более или менее понятно а со структурой перебора многомерного ассоциативного массива в JS помогите пож .
 |  |  
	| 
		
	| 
			
			 
			
				22.07.2012, 16:09
			
			
			
		 |  
	| 
		
			
			| что-то знаю       |  | 
					Регистрация: 24.05.2009 
						Сообщений: 5,176
					 
		
 |  |  
	| 
<script>
function recur( my_array ){
    if ( my_array && typeof my_array === "object" && Object.prototype.toString.call( my_array ) === "[object Object]" ) {
        for (var Name in my_array) {
            document.write(Name + " = " + recur( my_array[Name] ) + "<br>");
        }
    } else {
        return my_array;
    }
}
recur({
    "lev1": {
        "lev2": {
            "lev3": {
                "lev4": "test"
            }
        }
    },
    "alev1": {
        "alev2": {
            "alev3": {
                "alev4": null
            }
        }
    }
});
</script>
			 Последний раз редактировалось devote, 22.07.2012 в 16:22.
 |  |  
	| 
		
	| 
			
			 
			
				22.07.2012, 16:09
			
			
			
		 |  
	| 
		
			|  | Модератор Всея Форума       |  | 
					Регистрация: 14.05.2009 
						Сообщений: 4,021
					 
		
 |  |  
	| 
	
 
	| Сообщение от zbs2000 |  
	| Прочитал что для ассоциативных массивов существует структура JS for in |  
	
 В JS нет ассоциативных массивов, а конструкция for in нужна для перебора ключей объекта.
 
Многомерные массивы можно перебирать либо напрямую (вложенные циклы, не рекомендуется), либо итеративно, либо рекурсивно. Тебе больше подойдет последний вариант, ибо он проще:
 
function iterator (array, callback) {
  var item, index = 0, length = array.length;
  for (; index < length; index++) {
    item = array[index];
    
    if (Object.prototype.toString.call(item) === '[object Array]') {
      iterator(item, callback);
    } else {
      callback(item);
    }
  }
}
// Будет вызвана для каждого элемента, не являющимся массивом.
function callback (item) {
  console.log(item);
}
var array = [[[1.1], [1.2], [1.3], [1.4]], [[2.1], [2.2], [2.3], [2.4]], [[3.1], [3.2], [3.3], [3.4]]];
iterator(array, callback);
Остальное сам под себя допишешь.
				__________________ 
				Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф			 Последний раз редактировалось B~Vladi, 22.07.2012 в 16:12.
 |  |  
	| 
		
	| 
			
			 
			
				22.07.2012, 16:18
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 31.05.2012 
						Сообщений: 396
					 
		
 |  |  
	| Если известно, что мужно перебрать объект до 4 уровня вложенности, то можно использовать 4 вложенных цикла for ... in. 
//для теста
var masiv=[[[[0, 1], [2, 3]], [[4, 5], [6, 7]]], [[[8, 9], [10, 11]], [[12, 13], [14, 15]]]];
for (var i in masiv)
  for (var j in masiv[i])
    for (var k in masiv[i][j])
      for (var l in masiv[i][j][k])
        // действия с masiv[i][j][k][l], для теста:
        alert(masiv[i][j][k][l]);
Ред. Извините, пока писал, уже опоздал    Хотя, здесь ещё никто не привёл пример перебора напрямую.			 Последний раз редактировалось oneguy, 22.07.2012 в 16:29.
 |  |  
	| 
		
	| 
			
			 
			
				22.07.2012, 16:20
			
			
			
		 |  
	| 
		
			|  | Модератор Всея Форума       |  | 
					Регистрация: 14.05.2009 
						Сообщений: 4,021
					 
		
 |  |  
	| 
	
 
	| Сообщение от oneguy |  
	| можно использовать 4 вложенных цикла for ... in. |  
	
 Это называется говнокод:
 
	
 
	| Сообщение от B~Vladi |  
	| либо напрямую (вложенные циклы, не рекомендуется) |  
	
				__________________ 
				Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф |  |  
	| 
		
	| 
			
			 
			
				22.07.2012, 19:09
			
			
			
		 |  
	| 
		
			|  | I am Student       |  | 
					Регистрация: 17.12.2011 
						Сообщений: 4,415
					 
		
 |  |  
	| 
	
 
	| Сообщение от oneguy   |  
	| Если известно, что мужно перебрать объект до 4 уровня вложенности, то можно использовать 4 вложенных цикла for ... in. звините, пока писал, уже опоздал
  Хотя, здесь ещё никто не привёл пример перебора напрямую. |  
	
 for in в раза медленнее  for |  |  
	| 
		
	| 
			
			 
			
				22.07.2012, 21:38
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 31.05.2012 
						Сообщений: 396
					 
		
 |  |  
	| 
	
 
	| Сообщение от B~Vladi |  
	| Это называется говнокод: |  
	
 Это не совсем говнокод. Если уровень вложенности задан и небольшой, то иногда удобнее использовать вложенные циклы for или for ... in. Вы ведь не будете делать рекурсией перебор до 2 уровня вложенности? Кстати, хотя я не тестил, но мне кажется, что перебор напрямую будет работать быстрее, чем перебор рекурсией. Хотя, естественно, перебор рекурсией полезен во вногих случаях, в том числе, когда нужно перебрать объект с большим или переменным уровнем вложенности. |  |  
	| 
		
	| 
			
			 
			
				22.07.2012, 21:39
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 31.05.2012 
						Сообщений: 396
					 
		
 |  |  
	| 
	
 
	| Сообщение от cyber   |  
	| for in в раза медленнее  for |  
	
 Речь шла об обычных объектах, не обязательно являющихся массивами. |  |  
	| 
		
	| 
			
			 
			
				23.07.2012, 01:23
			
			
			
		 |  
	| 
		
			|  | Модератор Всея Форума       |  | 
					Регистрация: 14.05.2009 
						Сообщений: 4,021
					 
		
 |  |  
	| 
	
 
	| Сообщение от oneguy |  
	| Это не совсем говнокод. |  
	
 Это говнокод.
 
	
 
	| Сообщение от oneguy |  
	| Если уровень вложенности задан и небольшой, то иногда удобнее использовать вложенные циклы for или for ... in. Вы ведь не будете делать рекурсией перебор до 2 уровня вложенности? |  
	
 Помимо рекурсии есть ещё варианты.
 
Итеративный способ сделает это быстрее рекурсии.
 
	
 
	| Сообщение от oneguy |  
	| иногда удобнее использовать вложенные циклы |  
	
 Я бы за такое так руки отбил, что бы не было желания к клаве их тянуть.
				__________________ 
				Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф |  |  |  |