2015-04-01 3 views
0

Так что я пытаюсь захватить некоторые данные из объекта json через цикл for in и он продолжает возвращаться не определен. Вот мой код:Javascript json return undefined

router.get('/', function(req, res, next) { 
    request('https://api.instagram.com/v1/media/popular?client_id=############', function (error, response, body) { 
    json = JSON.parse(body); 
    var popular_tags = []; 

    for (var key in json['data']){ 
     tag = JSON.stringify(key['tags']) 
     popular_tags.push(tag) 
    } 
    console.log(popular_tags) 

    res.render('index', {title: body }); 
    }); 
}); 

Это выход я получаю:

[ undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined, 
    undefined ] 

Однако, когда я пытаюсь

var popular_tags = []; 
popular_tags.push(json['data'][0]['tags']) 
console.log(popular_tags) 

Это напечатает то, что я хочу. Какие-либо предложения?

ответ

1

Измените линию

tag = JSON.stringify(json['data'][key]['tags']) 
+0

Спасибо за помощь! –

1

Когда вы говорите

for (var key in json['data']) 

key итерация через имена атрибутов объекта json.data, и, таким образом, строка. Таким образом, key['tags'] является undefined, поскольку строки обычно не имеют атрибута tags. Вещи снежки оттуда.

Общий идиома:

for (var key in json.data) { 
    if (json.data.hasOwnProperty(key) { 
    var item = json.data[key]; 
    // ... 
    } 
} 

hasOwnProperty вещь защита против кого-то инъекционного в качестве прототипа того, что Вы повторяется для. Например, если кто-то сделал что-то глупое, как Object.prototype.breakAllCode = true, "breakAllCode" будет отображаться как key на все, что вы делали итерации.