Вход

Просмотр полной версии : JS Перебор ассоциативного многомерного массива


zbs2000
22.07.2012, 15:53
Подскажите пож есть ли возможность перебрать многомерный ассоциативный массив внутри функции 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 помогите пож .

devote
22.07.2012, 16:09
<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>

B~Vladi
22.07.2012, 16:09
Прочитал что для ассоциативных массивов существует структура 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);

Остальное сам под себя допишешь.

oneguy
22.07.2012, 16:18
Если известно, что мужно перебрать объект до 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]);

Ред. Извините, пока писал, уже опоздал :) Хотя, здесь ещё никто не привёл пример перебора напрямую.

B~Vladi
22.07.2012, 16:20
можно использовать 4 вложенных цикла for ... in.
Это называется говнокод:

либо напрямую (вложенные циклы, не рекомендуется)

cyber
22.07.2012, 19:09
Если известно, что мужно перебрать объект до 4 уровня вложенности, то можно использовать 4 вложенных цикла for ... in.
звините, пока писал, уже опоздал :) Хотя, здесь ещё никто не привёл пример перебора напрямую.

for in в раза медленнее for

oneguy
22.07.2012, 21:38
Это называется говнокод:
Это не совсем говнокод. Если уровень вложенности задан и небольшой, то иногда удобнее использовать вложенные циклы for или for ... in. Вы ведь не будете делать рекурсией перебор до 2 уровня вложенности? Кстати, хотя я не тестил, но мне кажется, что перебор напрямую будет работать быстрее, чем перебор рекурсией. Хотя, естественно, перебор рекурсией полезен во вногих случаях, в том числе, когда нужно перебрать объект с большим или переменным уровнем вложенности.

oneguy
22.07.2012, 21:39
for in в раза медленнее for
Речь шла об обычных объектах, не обязательно являющихся массивами.

B~Vladi
23.07.2012, 01:23
Это не совсем говнокод.
Это говнокод.

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

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

иногда удобнее использовать вложенные циклы
Я бы за такое так руки отбил, что бы не было желания к клаве их тянуть.