Как перебрать ассоциативный массив JSON в JavaScript? - PullRequest
12 голосов
/ 18 мая 2011

Я получаю JSON-ответ от сервера, и мне нужно пройтись по массиву в javascript и получить значения. Но я не могу пройти через это.

Ответ массива в формате JSON выглядит следующим образом:

{
   "1": "Schools",
   "20": "Profiles",
   "31": "Statistics",
   "44": "Messages",
   "50": "Contacts"
}

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

Я пробовал:

$.each(response, function(key, value) {
    alert(key + ' ' + value);
});

// and 

for (var key in response) {
    alert(key + ' ' + response[key]);
}

Но ни тот, ни другой не дают правильных значений.

Заранее спасибо за любую помощь.

Ответ: Привет, Ответ, который я получаю со вторым циклом:

0 {
1 "
2 1
3 "
4 :
5 "
6 S

и т. Д.

Так что это означает, что он проходит через весь ответ в виде строки и разделяет его как ключ / значение.

Спасибо

Ответы [ 6 ]

19 голосов
/ 18 мая 2011

Ваша проблема в том, что вы не анализируете строку JSON. Поэтому ваш foreach проходит через символы в строке JSON.

// If you are using jQuery.ajax, you can just set dataType to 'json' 
// and the following line will be done for you
var obj  = jQuery.parseJSON( response );
// Now the two will work
$.each(obj, function(key, value) {
    alert(key + ' ' + value);
});


for (var key in obj) {
    alert(key + ' ' + response[key]);
}
2 голосов
/ 11 ноября 2011

Вам не нужно так поступать, работа со строками - скучная работа. Вы можете сделать объект через ответ. 1: json = eval(xmlHttp.responseText);

но это в некоторой степени небезопасно.

  1. json = JSON.parse(xmlHttp.responseText, function(key,value){// can do some other stuff here.});

тогда вы можете использовать переменную как обычный объект, например, obj.a или obj ["a"].

Пусть это вам поможет.

2 голосов
/ 18 мая 2011
var response = {"1":"Schools","20":"Profiles","31":"Statistics","44":"Messages","50":"Contacts"};

for (var i in response) {
    console.log(i + ' ' + response[i]);
}

Работает просто отлично, как ты получаешь ответ?

1 голос
/ 18 мая 2011

http://jsfiddle.net/sG5sF/

jQuery.each работает нормально.Так же и for-each loop

http://jsfiddle.net/TfjrS/

Они оба работают так, как должныУ вас могут быть ошибки в других частях вашего кода.Правильно ли установлена ​​переменная response для объекта JSON, указанного в вашем вопросе?Вы проверяете ответ statusCode?это должно быть 200 для успешного ответа?

0 голосов
/ 18 мая 2011

Вы можете использовать for-in конструкцию в чистом Javascript. Конечно, вам нужно быть осторожным, чтобы вы смотрели только на собственные свойства объекта (такие библиотеки, как Prototype, как правило, загрязняют):

for(var key in response) {
    if(response.hasOwnProperty(key)) {
       ...
    }
}

EDIT

Вы используете jQuery.ajax? Что такое dataType значение? Это должно быть json. Это может быть причиной того, что ваш ответ интерпретируется как строка. Кроме того, когда вы console.log отвечаете, он отображается как строка или объект?

0 голосов
/ 18 мая 2011

Посмотрите на Как я могу проанализировать объект JavaScript с jQuery для возможного ответа.

...