2016-07-28 2 views
-1

Я кэшировал JSON, возвращенный из вызова Ajax, и вам нужно пройти его, чтобы отобразить его. Я получаю сообщение об ошибке: «Невозможно прочитать свойство« название неопределенного ». Может ли кто-нибудь помочь?JQuery - Как прокручивать JSON, используя каждый

$.each(cache['cat-'+cat], function(i, jd) {    
    var title= jd.title; //issue is here 
)} 

Когда я console.log(cache['cat-'+cat]) я получаю ниже:

Object { 
    date: "2016-07-28T15:08:03.596Z", 
    data: '[{"id":471,"title":"Lines and Calls","solution_areas":"lines-calls"}]' 
} 

Когда я console.log (JD) в пределах цикла я получаю ниже:

2016-07-28T15:13:14.553Z 

если я использую console.log(jd.data); I get

undefined

Я пробовал ниже, но они не работают либо:

var title= jd.data.title; 
var title= jd.data[0].title; 

Может кто-нибудь сказать мне, что я делаю неправильно?

+0

Итак, существуют ли кавычки вокруг значения 'data'? – nicael

+0

Я так не думаю? – LeeTee

+0

в вашем примере есть, так что тогда его нужно будет разобрать снова, так как это просто строка ... – NDM

ответ

0

Just need to understand what is JSON and what is STRING

кэшем [ «кот -» + кошка] .data возвращает строку, нужно преобразовать в формат JSON, прежде чем проход для каждого цикла:

var dataCacheReturned = cache['cat-'+cat]; 

var objCache = dataCacheReturned.data; //Its return a string 
objCache = JSON.parse(objCache); //Parse string to json 

$.each(objCache, function(i, jd) { 
    var title = jd.title; 
    console.log(title); 
}); 
1

У вас нет доступа к этому исправлению. А поскольку cache['cat-'+cat] - это уже необходимый объект, в чем цель $.each? Должно быть

var title= JSON.parse(cache['cat-'+cat].data)[0].title; 

(поскольку название в data и data является JSON).

Демо:

var obj = { 
 
    date: "2016-07-28T15:08:03.596Z", 
 
    data: '[{"id":471,"title":"Lines and Calls","solution_areas":"lines-calls"}]' 
 
}; 
 
var title= JSON.parse(obj.data)[0].title; 
 
console.log(title);

+0

Я что-то пропустил? Прокомментируйте комментарий: – nicael

+0

@Rory Я разбираю атрибут 'data', это JSON, а не объект. – nicael

+0

Ах да, ты прав. Не знаю, для чего это. Фейны с нисходящими потоками выглядят в силе в настоящий момент. –

2

, как вы используете его, each будет перебрать все свойства cache['cat-'+cat] объекта, из которых два, date и data.

Таким образом, ваша анонимная функция function(i, jd) будет называться дважды. В первый раз jd будет значением свойства date (строка), во второй раз это будет значение свойства data (также строка, которая, как представляется, отформатирована как JSON).

Содержимое data должны быть разобраны, прежде чем они могут быть доступны в качестве объекта/массива, и при условии, что data форматируется как массив, я предполагаю, что вы на самом деле хотите, чтобы выполнить пошаговый. Учитывая пример при условии, я хотел бы изменить его:

$.each(JSON.parse(cache['cat-'+cat].data), function(i, jd) {    
    var title= jd.title; 
}); 
+0

. В чем смысл итерации? В 'data' есть только один элемент. – nicael

+0

@nicael - Если массив данных содержит только один объект, его нет. Но учитывая, что это массив (после разбора), вполне вероятно, что LeeTee намерен заселить его несколькими объектами в какой-то момент. Таким образом, требуется итерация. – damlu

+1

@ultrajohn - Где? – damlu