Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Из объекта в одномерный массив (https://javascript.ru/forum/css-html/42681-iz-obekta-v-odnomernyjj-massiv.html)

L0k1 05.11.2013 19:32

Из объекта в одномерный массив
 
Здравствуйте уважаемые форумчане!

Столкнулся я с задачкой, которая вогнала меня в тупик:

есть объект:
obj  = {
    arr1: [
               'a1_val1', 
               'a1_val2'
            ], 
    arr2: [
               'a2_val1', 
               'a2_val2', 
               'a2_val3'
            ]
}


его нужно перегнать в одномерный массив со строками :

ansver = [
               'a1_val1 a2_val1', 
               'a1_val1 a2_val2',
               'a1_val1 a2_val3 ', 
               'a1_val2 a2_val1', 
               'a1_val2 a2_val2',
               'a1_val2 a2_val3 '
]


количество arr* в obj может быть любым, как и количество элементов в массивах arr*

Подозреваю, что рекурсия мне поможет - но, видимо скилов не хватает применить ее правильно к этому примеру.

Камрады, не прошу писать код за меня, подскажите на пальцах алгоритм

зы: код не прикладываю, так как у меня он даже приблизительно правильно не работает

danik.js 05.11.2013 19:38

Цитата:

Сообщение от L0k1
количество arr* в obj может быть любым

Тогда непонятно как нужно составлять комбинации если например количество arr* три, или больше. Покажи пример.

L0k1 05.11.2013 19:45

Эта вся лабуда делается для фильтра по параметрам

есть url прмерно такого вида:
Код:

#!/arr1=a_val1+a_val2&arr2=a2_val1+a2_val2+a2_val3
из этого url, собственно, и получается объект obj

а у элементов в доме есть аттрибуты, типа : data-arr1='a_val1' data-arr2='a2_val3'

а массив на выходе содержал бы аттрибуты тех элементов, которые подходят под эти параметры

L0k1 05.11.2013 21:02

Цитата:

Сообщение от danik.js (Сообщение 279694)
Тогда непонятно как нужно составлять комбинации если например количество arr* три, или больше. Покажи пример.

попробую еще разок, может и самому понятнее станет
объект:
{
 [a1,a2,a3],
 [b1,b2],
 [c1,c2]
}


и тут ляськи-масяськи, ахалай-махалай и в массив:

[
 " a1 b1 c1 ",
 " a1 b1 c2 ",
 " a1 b2 c1 ",
 " a1 b2 c2 ",
 " a2 b1 c1 ",
 " a2 b1 c2 ",
 " a2 b2 c1 ",
 " a2 b2 c2 ",
 " a3 b1 c1 ",
 " a3 b1 c2 ",
 " a3 b2 c1 ",
 " a3 b2 c2 ",
]


вот так для 3х arr*

рони 05.11.2013 22:11

L0k1,
:write:
var arr = [
 ['a1','a2','a3'],
 ['b1','b2'],
 ['c1','c2']
]
;
function go(b) {
    for (var a = 0; a < b.length - 1; a++) {
        for (var c = [], d = 0 ; d < b[a].length; d++)
            for (var e = 0; e < b[a + 1].length; e++) c.push(b[a][d] + " " + b[a + 1][e]);
        b[a + 1] = c
    }
    return c
};
alert(go(arr).join('\n'))

L0k1 05.11.2013 22:29

Рони, спасибо!
Отрабатывает так как надо, буду вникать в код - я его не полностью понимаю, выше моего уровня.

ksa 05.11.2013 23:43

Цитата:

Сообщение от L0k1 (Сообщение 279709)
объект:
{
 [a1,a2,a3],
 [b1,b2],
 [c1,c2]
}

Это не объект. :nono: Это синтаксическая ошибка...

L0k1 06.11.2013 00:24

Уважаемый KSA, это не листинг, это наглядное представление. Я пытался максимально прозрачно объяснить, что именно мне нужно.

Рони понял и помог, за что ему огромное спасибо.
А вы, судя по вашим постам на форуме, в основном придираетесь к стилю изложения, вместо того, чтобы сказать по существу вопроса.

BETEPAH 06.11.2013 00:59

А если на входе все-таки объект, а не массив массивов, то код рони можно немного дополнить:
var obj  = {
    arr1: [
               'a1_val1', 
               'a1_val2'
            ], 
    arr2: [
               'a2_val1', 
               'a2_val2', 
               'a2_val3'
            ]
}
var arr = [];
for (var key in obj) {
	arr.push(obj[key]);
}
function go(b) {
    for (var a = 0; a < b.length - 1; a++) {
        for (var c = [], d = 0 ; d < b[a].length; d++)
            for (var e = 0; e < b[a + 1].length; e++) c.push(b[a][d] + " " + b[a + 1][e]);
        b[a + 1] = c
    }
    return c
};
alert(go(arr).join('\n'))

L0k1 06.11.2013 01:15

Да, на входе все-таки объект - и я его дополнил, практически так-же как и вы.
Спасибо за участие.


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