Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.07.2012, 15:53
Новичок на форуме
Отправить личное сообщение для zbs2000 Посмотреть профиль Найти все сообщения от zbs2000
 
Регистрация: 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 помогите пож .
Ответить с цитированием
  #2 (permalink)  
Старый 22.07.2012, 16:09
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 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>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 22.07.2012 в 16:22.
Ответить с цитированием
  #3 (permalink)  
Старый 22.07.2012, 16:09
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 22.07.2012, 16:18
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 22.07.2012, 16:20
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от oneguy
можно использовать 4 вложенных цикла for ... in.
Это называется говнокод:

Сообщение от B~Vladi
либо напрямую (вложенные циклы, не рекомендуется)
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #6 (permalink)  
Старый 22.07.2012, 19:09
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от oneguy Посмотреть сообщение
Если известно, что мужно перебрать объект до 4 уровня вложенности, то можно использовать 4 вложенных цикла for ... in.
звините, пока писал, уже опоздал Хотя, здесь ещё никто не привёл пример перебора напрямую.
for in в раза медленнее for
Ответить с цитированием
  #7 (permalink)  
Старый 22.07.2012, 21:38
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от B~Vladi
Это называется говнокод:
Это не совсем говнокод. Если уровень вложенности задан и небольшой, то иногда удобнее использовать вложенные циклы for или for ... in. Вы ведь не будете делать рекурсией перебор до 2 уровня вложенности? Кстати, хотя я не тестил, но мне кажется, что перебор напрямую будет работать быстрее, чем перебор рекурсией. Хотя, естественно, перебор рекурсией полезен во вногих случаях, в том числе, когда нужно перебрать объект с большим или переменным уровнем вложенности.
Ответить с цитированием
  #8 (permalink)  
Старый 22.07.2012, 21:39
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от cyber Посмотреть сообщение
for in в раза медленнее for
Речь шла об обычных объектах, не обязательно являющихся массивами.
Ответить с цитированием
  #9 (permalink)  
Старый 23.07.2012, 01:23
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от oneguy
Это не совсем говнокод.
Это говнокод.

Сообщение от oneguy
Если уровень вложенности задан и небольшой, то иногда удобнее использовать вложенные циклы for или for ... in. Вы ведь не будете делать рекурсией перебор до 2 уровня вложенности?
Помимо рекурсии есть ещё варианты.

Итеративный способ сделает это быстрее рекурсии.

Сообщение от oneguy
иногда удобнее использовать вложенные циклы
Я бы за такое так руки отбил, что бы не было желания к клаве их тянуть.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание многомерного массива из PHP ivandelov Общие вопросы Javascript 6 13.06.2012 21:01
Заполнение массива JS из MySQL blax Events/DOM/Window 2 01.11.2011 07:53
Перебор массива объектов Триви jQuery 12 26.08.2011 09:22
Доступ к элементам многомерного массива TheKIP Общие вопросы Javascript 7 05.08.2011 14:46
Передача массива JS в cookies Denis Общие вопросы Javascript 1 04.08.2009 12:24