Как рекурсивно пройтись по ассоциативному многомерному массиву?
Всем привет.
Имеется многомерный ассоциативный массив: var Config = { "БПИ": { "30": { "12": [ "2,5" ], "24": [ "1,25" ], "48": [ "0,65" ] }, "60": { "12": [ "5,0" ], "24": [ "2,5" ], "36": [ "1,5" ], "48": [ "1,25" ] }, "125": { "12": [ "10" ], "24": [ "5" ], "48": [ "2,5" ] }, "250": { "12": [ "20,0" ], "24": [ "10,0" ], "48": [ "5,0" ] } } }; Как можно разбить данный массив на несколько индексных массивов, в которых будут содержаться элементы каждого подуровня. То есть для нашего примера будут массивы со следующими элементами: arr[0] = ["БПИ"]; arr[1] = ["30","60","125","250"]; arr[2] = ["12","24","48","12","24","36","48","12","24","48"]; arr[3] по аналогии. Вложенность может быть ещё больше(то есть появятся arr[4], arr[5] и т.д. вплоть до arr[10]. |
Цитата:
|
Цитата:
Внимательно перечитайте первый пост, и уловите мысль, которую пытался донести до нас автор, а не бросайтесь автоматическими фразами как собака павлова cbone, Пишите. for( in ) для перебора и перебираем рекурсивно. там не две строчки кода, поэтому мне лениво писать за вас. |
Чем дальше тем хуже.=\
Единственно правльный и логичный вариант в вашем случае уже был приведён в предыдущей теме, простые массивы, где заглавием является нулевой элемент. Ив вообще, скжите для чего вы хотите это использовать и мы предложим вам подходящие варианты. |
Цитата:
Ты записал туда все ключи "третьего уровня"... Покажи как будет выглядеть твой массив на таком примере var config = { "БПИ": { "30": { "12": [ "2,5" ], "24": [ "1,25" ], "48": [ "0,65" ] }, "60": { "12": [ "5,0" ], "24": [ "2,5" ], "36": [ "1,5" ], "48": [ "1,25" ] }, "125": { "12": [ "10" ], "24": [ "5" ], "48": [ "2,5" ] }, "250": { "12": [ "20,0" ], "24": [ "10,0" ], "48": [ "5,0" ] } }, "ВГИ": { "10": { "1": [ "2,5" ], "2": [ "1,25" ], "3": [ "0,65" ] }, "20": { "1": [ "5,0" ], "2": [ "2,5" ], "3": [ "1,5" ], "4": [ "1,25" ] }, "30": { "1": [ "10" ], "2": [ "5" ], "3": [ "2,5" ] }, "40": { "1": [ "20,0" ], "2": [ "10,0" ], "3": [ "5,0" ] } } }; |
Цитата:
|
Цитата:
Цитата:
По-моему из контекста вполне однозначно ясно, что подразумевается вложенность исходного многомерного массива, и что если его вложенность возрастет на уровень, два, или более, то появятся элементы arr[4], arr[5] и т.д. вплоть до arr[10]. Или для Вас этот контекст не столь очевиден? |
Цитата:
Цитата:
|
Цитата:
var config = { "БПИ": { "30": { "12": [ "2,5" ], "24": [ "1,25" ], "48": [ "0,65" ] }, "60": { "12": [ "5,0" ], "24": [ "2,5" ], "36": [ "1,5" ], "48": [ "1,25" ] }, "125": { "12": [ "10" ], "24": [ "5" ], "48": [ "2,5" ] }, "250": { "12": [ "20,0" ], "24": [ "10,0" ], "48": [ "5,0" ] } } }; var a=[],b,c; var i,j,k; for(i in config) { a[a.length]=new Array(i); b=[]; c=[]; for( j in config[i]) { b[b.length]=j; for( k in config[i][j]) { c[c.length]=k; }; }; a[a.length]=b; a[a.length]=c; }; for (var i=0; i<a.length; i++) { alert('a['+i+'] = '+a[i]); } |
Вариант ...
var O = { "БПИ": { "30": { "12": [ "2,5" ], "24": [ "1,25" ], "48": [ "0,65" ] }, "60": { "12": [ "5,0" ], "24": [ "2,5" ], "36": [ "1,5" ], "48": [ "1,25" ] }, "125": { "12": [ "10" ], "24": [ "5" ], "48": [ "2,5" ] }, "250": { "12": [ "20,0" ], "24": [ "10,0" ], "48": [ "5,0" ] } } }; function look(h) { var b = []; return function (f, a) { var c, a = a || 0, d; !b[a] && (b[a] = []); for (d in f) if (b[a].push(d) && (c = f[d])&& typeof c=='object') { var g = {}, e; for (e in c) g[e] = c[e]; arguments.callee(g, a + 1) } return b }(h) }; var s=look(O).join('\n'); alert(s); |
рони, ваш "вариант" ушёл в бесконечный цикл и повесил ff. Проверять надо же...
|
trikadin,
Поверьте ещё раз ... если интересно ))) |
рони, нормально. Что-то поменяли?
|
Цитата:
P.S. Правда и мой вариант так же не запустился... :( Хотя на работе все показывало нормально. |
Цитата:
|
ksa,
В опере тоже всё должно работать ... melky, Я по разному пишу ... но чаще так ))) |
Цитата:
Вот только что за нули в самой последней строке? Автор такого вроде не заказывал... :D |
Цитата:
Вот пример на сайте http://en-i.ru/product-catalog/energ...ies/Pulse_BPI/ (форму можно посмотреть нажав на кнопку "Подобрать Импульсные БПИ)" Тут как раз описаны БПИ. Но некоторая продукция имеет более сложную конфигурацию и кол-во модификаций может достигать 2000 с лишним. Для этого я хочу избавиться от нынешней формы подбора продукции и сделать так, чтобы пользователь просто выбрал нужную ему конфигурацию и нажал кнопку "Купить". При этом, выбирая определённые характеристики товара должна проходить проверка остальных характеристик и некоторые из них должны становиться некликабельными (именно те которые несовместимы с уже выбранными). Пример того, что я хочу получить можно посмотреть здесь: http://quto.ru/BMW/1series/E81_E82_E87_E88/hatchback3d/ Там при подборе комплектации автомобиля (например при выборе объема двигателя 3л.) затемняются лишние характеристики и дизельный двигатель уже нельзя выбрать. Что то вроде этого я и хочу сделать для своего сайта. |
Цитата:
var config = { "БПИ": { "30": { "12": { "2,5": { "да": [ "1,2", "3" ], "нет": [ "1" ] } }, "24": [ "1,25" ], "48": [ "0,65" ] }, "60": { "12": [ "5,0" ], "24": [ "2,5" ], "36": [ "1,5" ], "48": [ "1,25" ] }, "125": { "12": [ "10" ], "24": [ "5" ], "48": [ "2,5" ] }, "250": { "12": [ "20,0" ], "24": [ "10,0" ], "48": [ "5,0" ] } } }; |
Цитата:
3. Добавлять циклов и временных массивов до нужного количества уровней... 2. Таки делать рекурсию. |
Цитата:
|
cbone, хозяин - барин... :)
|
Реализовал я поставленную задачу. Также сделал подборщика. Может кому пригодится:
$(document).ready(function() { //Задали массивы var ConfigName = ["Наименование", "Мощность, Вт", "Напряжение, В", "Ток, А"]; //Массив для названия каждого уровня массива Config var Config = { "БПИ": { "30": { "12": [ "2.5" ], "24": [ "1.25" ], "48": [ "0.65" ] }, "60": { "12": [ "5.0" ], "24": [ "2.5" ], "36": [ "1.5" ], "48": [ "1.25" ] }, "125": { "12": [ "10.0" ], "24": [ "5.0" ], "48": [ "2.5" ] }, "250": { "12": [ "20.0" ], "24": [ "10.0" ], "48": [ "5.0" ] } } }; //############################################################################## // Рекурсивная функция для вывода конфигураций товара var ResultArray = []; var current_level = -1; function Recursion(Arr){ current_level++; if(Arr instanceof Object){ for ( var key in Arr) { if (Arr instanceof Array) { content = Arr[key]; } else if (Arr instanceof Object) { content = key; } if(ResultArray[current_level] == null) { ResultArray[current_level] = content+";"; } else { if(ResultArray[current_level].indexOf(content) == -1) { ResultArray[current_level] = ResultArray[current_level]+content+";"; } } Recursion(Arr[key]); } } current_level--; } Recursion(Config); //Вызвали рекурсивную функцию /* наводим порядок в массиве ResultArray[] и переносим данные в двумерный массив */ var SplitArray = []; for ( var int = 0; int < ResultArray.length; int++) { ResultArray[int] = ResultArray[int].slice(0, -1); SplitArray[int] = ResultArray[int].split(";"); } /* Вывод формы подбора в браузер */ for ( var int = 0; int < ConfigName.length; int++) { if(int == 0) { $("#wrap").append("<dl></dl>"); } else { $("#wrap").append("<dl class=\"dn\"></dl>"); } $("#wrap dl:eq("+int+")").append("<dt>"+(int+1)+". "+ConfigName[int]+":</dt>"); for ( var int2 = 0; int2 < SplitArray[int].length; int2++) { $("#wrap dl:eq("+int+")").append("<dd><span><a class=\"das\" href=#>"+SplitArray[int][int2]+"</a></span></dd>"); } } /* Обработка событий */ $("a.das").click(function(){ var current_dl = $(this).parents("dl").index(); // Текущий <dl> var length_conf = $("dl").size(); // К-во <dl> /* Убрали лишние class="active" */ for(var int=current_dl; int<length_conf; int++){ $("dl:eq("+int+") span").removeClass("active"); } /* Добавили нужному элементу class="active" и убрали всем лишним на текущем уровне */ $(this).parents("dl").find("span").removeClass("active"); $(this).parent("span").toggleClass("active"); /* Формируем массив active_arr[] */ var active_arr = []; // Массив для хранения <span class="ACTIVE"> for ( var int = 0; int < current_dl; int++) { active_arr[int] = $("dl:eq("+int+") span.active a.das").text(); } /* Формируем массив, содержащий конфигурацию для следующего подуровня */ var ConfigTemp = Config; for ( var int=0; int<active_arr.length; int++) { ConfigTemp = ConfigTemp[active_arr[int]]; } var correct_arr = []; for ( var key in ConfigTemp) { if (current_dl < (length_conf-1)) { correct_arr.push(key); } else { correct_arr.push(ConfigTemp[key]); } } /* Скрыли все <dd> следующего уровня */ $("dl:eq("+(current_dl)+") dd").hide(); /* Показали только подходящие */ count_dd = $("dl:eq("+(current_dl)+") dd").length; for ( var int = 0; int < correct_arr.length; int++) { for(var int2=0; int2<count_dd; int2++) { if( $("dl:eq("+(current_dl)+") dd:eq("+int2+") span a").text() == correct_arr[int] ) { $("dl:eq("+(current_dl)+") dd:eq("+int2+")").show(); } } } $(this).parents("dl").nextAll("dl").delay(200).hide(); //Скрыли $(this).parents("dl").next("dl").fadeIn(); //Показали if(count_dd == 0) { $("form").fadeIn(); } else { $("form").hide(); } return false; }); $("form input[type=submit]").click(function(){ //var query = return false; }); }); Если кому интересно посмотреть рабочий пример, пишите в личку - дам ссылку. |
помогите найти ошибку в коде
var mas = new Array(); mas[0] = new Array(); mas[0] = "aaa"; mas[1] = new Array(); mas[1] = "bbb"; |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 09:22. |