Как перебрать многомерный ассоциативный массив javascript?

У меня есть "многомерный ассоциативный" массив javascript (который на самом деле является объектом со свойствами, поскольку JS не может иметь собственный ассоциативный массив):

var multiArray={ AAA:"one", BBB:"two", CCC:{ 0:"xxx", 1:"yyy", 2:"zzz"} };

И мне нужно получить такую ​​строку из этого массива:

«AAA=один и BBB=два и CCC=xxx,yyy,zzz»

Как я могу это сделать?

Если я использую два простых цикла, например:

for(var key in multiArray)
{
        for(var subkey in multiArray[key])
        {
            string = string + multiArray[key][subkey]+",";
        }
}

Я получаю что-то вроде этого:

«AAA = o,n,e & BBB = t,w,o & CCC = xxx, yyy,zzz»

Что мне не нужно.

Какие-нибудь решения, использующие только Javascript?


person Andrew    schedule 19.05.2012    source источник
comment
Почему multiArray['CCC'] не массив?   -  person kojiro    schedule 19.05.2012
comment
поскольку JS не может иметь собственный ассоциативный массив Интересно. Не могли бы вы уточнить?   -  person KooiInc    schedule 19.05.2012
comment
@KooiInc Javascript имеет индексированные массивы и объекты. Наверное, это и имел в виду Андрей.   -  person inhan    schedule 19.05.2012


Ответы (2)


Я бы использовал такую ​​​​функцию, как

var multiArray={ AAA:"one", BBB:"two", CCC:{ 0:"xxx", 1:"yyy", 2:"zzz"} };

function objToStr(o,delim) {
    if (/^(string|boolean|number)$/.test(typeof o)) return o;
    delim = delim || '&'; // delimiter
    var arr = [], isArray = true;
    for (var j in o) {
        if (isNaN(parseInt(j))) { isArray = false; break; }
    }
    if (isArray) {
        for (var j in o) arr[j] = objToStr(o[j],delim);
        return arr.join(',');
    }
    for (var j in o) {
        if (typeof o[j] != 'object') arr.push(j+'='+o[j]);
        else arr.push(j+'='+objToStr(o[j],delim));
    }
    return arr.join(delim);
}
console.log(objToStr(multiArray,'&'))

РЕДАКТИРОВАТЬ: вам нужно экранировать здесь необходимые символы, если это будет GET-запрос. Кроме того, я не уверен, что вы ожидаете от следующего массива, поэтому я не смог написать лучший код, который удовлетворит ваши потребности.

var multiArray={ AAA:"one", BBB:"two", CCC:{ 0:"xxx", 1:"yyy", 2:{a:1, b:2}} };
person inhan    schedule 19.05.2012
comment
Хотя ответ Парта имеет правильный ключевой момент, его результирующая строка не совсем верна. Ваша функция возвращает именно то, что я хотел. Спасибо. - person Andrew; 19.05.2012
comment
Пожалуйста. Хотя это не окончательно из-за тех двух моментов, которые я упомянул в нижнем разделе редактирования. - person inhan; 20.05.2012

Хорошо, я создал скрипт здесь: http://jsfiddle.net/bJ6HH/. Работает для любой глубины вложенности.

person Parth Thakkar    schedule 19.05.2012
comment
Да, этот ответ работает. Ключевым моментом здесь является проверка того, является ли свойство объектом: 'if(typeof o[k] == 'object')' ; - person Andrew; 19.05.2012
comment
тогда почему кто-то проголосовал за это? Я знаю, что ответ Инхана более сложный и подробный, но для этого простого сценария я нашел свой метод проще... - person Parth Thakkar; 19.05.2012
comment
Да, я согласен, ваш код на самом деле лучше. Я только что добавил функциональность массива в свое предложение. Я бы не стал минусовать ваше решение. Кто-то, должно быть, сделал это по ошибке. - person inhan; 20.05.2012
comment
@Andrew typeof o[k] == 'object' в некотором роде достигает этого. Но если бы это был индексированный массив, вам нужно было бы использовать o[k] instanceof Array, поскольку класс Array расширяет Object. - person inhan; 20.05.2012