2016-05-31 3 views
-1

Я делаю проект с API-интерфейсом wikipedia media. Я запрашиваю API с помощью JQuery. Следующий запрос работает при проверке консоли developper в Chrome, как показано в этом codepen http://codepen.io/jowze/pen/NNZNKY/?editors=1010Uncaught TypeError: Не удается прочитать свойство 'foo' undefined

$.ajax({ 
url:'https://en.wikipedia.org/w/api.php', 
    data: { action : 'query', generator: 'search', gsrnamespace : '0', gsrlimit : '10', prop : 'extracts', pilimit: 'max', 
exintro: '', explaintext: '', exsentences: '1' , exlimit: 'max' , gsrsearch: 'Richard Feynman', format: 'json'}, 
    dataType: 'jsonp', 

    success: function (x) { 
    var result = x.query.pages; 
    for (var i in result) { 
    var item = result[i].pageid; 
    console.log(item); 

    } 
    } 
}); 

Этот код работает, когда цикл по результату с для ... в цикле. При написании такой же код пытается получить доступ к переменной результата, как показано ниже, консоль печатает Uncaught TypeError: Cannot read property 'pageid' of undefined

success: function (x) { 
    var result = x.query.pages; 
    var item = result[0].pageid; 
    console.log(item); 

    } 
}); 

Любая идея, почему это происходит? Почему невозможно получить доступ к каждому ключу объекта JSON через result[0], result[1], ..., result[n]?

+0

Ключи кажутся строками (результаты - словарь). Не могли бы вы добавить вывод 'console.log (result)'? – martianwars

+2

Вы не можете получить к ним доступ через 'index', потому что' x.query.pages' возвращает вам объект JSON, а не тип 'Array'. Доступ к элементам 'Array' можно получить только с помощью' index'. – vijayP

+0

typeof (x.query.pages) дает объект, а не массив ... – gkb

ответ

0

Просто поместите консольные журналы, как указано в приведенном ниже коде, и вы поймете, почему вы столкнулись с этой ошибкой.

$.ajax({ 
    url:'https://en.wikipedia.org/w/api.php', 
    data: { action : 'query', generator: 'search', gsrnamespace : '0', gsrlimit : '10', prop : 'extracts', pilimit: 'max', exintro: '', explaintext: '', exsentences: '1' , exlimit: 'max' , gsrsearch: 'Richard Feynman', format: 'json'}, 
    dataType: 'jsonp', 
    success: function (x) { 
     var result = x.query.pages; 
     console.log("== What is the type of result : " + typeof(result)); //Object 
     console.log("Complete Result : " + JSON.stringify(result)); 
     for (var i in result) { 
      console.log("Property type for object result :" + typeof(i)); //String 
      var item = result[i].pageid; 
      var title = result[i].title; 
      var extract = result[i].extract; 
     } 
    } 
}); 

Итак, что вы пытаетесь сделать здесь, чтобы получить доступ к нечисловым свойствам объекта по индексу, который не возможно. Если вы хотите это сделать, вы можете узнать больше об этом here.

+0

Спасибо за помощь, Object.keys делает трюк! – jowze

0

Ключи вашего объекта результата представляют собой очень большие целые числа (не 0, 1, 2). results не является массивом, это объект JS. Поэтому индексы не начинаются с 0.

for (var i in result) 

.. итерацию по каждому ключу в объекте и, следовательно, result[i] работ. См. MDN для справки.

+0

Что именно вы подразумеваете под «ключами вашего объекта результата», это очень большие целые числа (а не 0, 1, 2) »? – vijayP

+0

Посмотрите на объект результатов. Ключи/свойства - это шестизначные числа. Вероятно, «свойства» - лучшее слово здесь – martianwars

0

Я думаю, что вы можете войти, что это результат так:

success: function (x) { 
    var result = x.query.pages; 
     var item = result[0].pageid; 
     console.log(result,result[0]); 
    } 
}); 

результат [0] не должен был ключ с именем Foo, если это проект

0

В вашем примере , вы попытались сделать result[0], который считывает первый элемент массива с именем result. Поскольку results является объектом, значит result[0] означает, что вы пытаетесь получить доступ к result.0, который в этом случае не всегда существует.

С result[0].pageid вы пытаетесь получить доступ result.0.pageid, который, очевидно, не будет существовать, если result.0 не существует. Следовательно, вы получите сообщение об ошибке «Uncaught TypeError: Невозможно прочитать свойство« pageid »undefined».