Использование счетчика в $ .each JQuery

У меня проблемы с использованием счетчика с $. Каждый раз, когда я получаю канал JSON, а затем хочу зациклить «заголовок» результатов. Если я использую число, он работает, но когда я пытаюсь использовать счетчик, например, var i = 1, он не работает. Я думаю, это связано с тем, что переменная не передается в функцию правильно?

Спасибо

  var i = 1;

  $.getJSON("http://www.aaronlumsden.com/api/?json=get_category_posts&slug=portfolio",function(data) {

   $.each(data, function(i) {
                    $('#navScroller').append('<li><a rel=""href="" title="">'+data.posts[i].title+'</a></li>');
                    i++;
                });
 });

person Aaron Lumsden    schedule 03.03.2012    source источник
comment
Параметр i, который вы определяете для обратного вызова, затеняет переменную i, которую вы определяете. Вы можете просто опустить параметр, но я думаю, что есть гораздо более простое решение, чем использование счетчика, в зависимости от data.   -  person Felix Kling    schedule 03.03.2012


Ответы (4)


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

data является объектом и $.each() [docs] < / a> выполняет итерацию по каждому свойству объекта. Пока я вижу, что у него 5 свойств (здесь как JSON):

{
    "status":"ok",
    "count":8,
    "pages":1,
    "category":{...},
    "posts": [...]
}

Если это единственные сообщения, $.each() вызовет обратный вызов пять раз, что означает, что вы получите заголовок первых пяти сообщений. Или, если сообщений меньше 5, вы получите ошибку.

Я думаю, вы действительно хотите перебрать все сообщения из ответа, которые будут:

var $scroller = $('#navScroller');
$.each(data.posts, function(i, post) {
    $scroller.append('<li><a rel=""href="" title="">'+post.title+'</a></li>');
});

Если у вас много сообщений, также имеет смысл заранее создать полную строку HTML и вызвать .append() один раз, например:

$('#navScroller').append($.map(data.posts, function(post) {
    return '<li><a rel=""href="" title="">'+post.title+'</a></li>';
}).join('')); // not sure if you actually need `.join`
person Felix Kling    schedule 03.03.2012

В each-функции. Вы объявляете параметр i. Это отменяет var i = 1 в первой строке. Удалите i в function(i), и я думаю, что все будет хорошо.

person Marnix    schedule 03.03.2012

var k = 1;

  $.getJSON("http://www.aaronlumsden.com/api/?json=get_category_posts&slug=portfolio",function(data) {

   $.each(data.posts, function(i) {
     $('.nav').append('<li><a rel=""href="" title="">'+data.posts[i].title+'</a></li>');
     k++;
   });
   // Use k here
 });

Я пробовал на том сайте. Это работает

person Ranganadh Paramkusam    schedule 03.03.2012
comment
На вопрос, ваш ответ правильный, но я пробовал использовать селектор на основном сайте, использовал код ur, потому что он правильный - person Ranganadh Paramkusam; 03.03.2012

person    schedule
comment
Я не могу представить, как это должно работать ... i будет именем свойства data (то есть строки), но data.posts - это массив, поэтому data.posts[i] будет undefined. Вы имели в виду data.posts[k]? - person Felix Kling; 03.03.2012
comment
@Felix Kling Нет, см. stackoverflow. com / questions / 2342371 / i переменная будет ключевой - person dotoree; 03.03.2012
comment
Хорошо, три замечания по этому поводу: (а) Если вы прочитаете мой ответ, то увидите, что data не массив, а объект. Вы действительно смотрели URL-адрес и ответ? В вопросе, с которым вы связались, data - это массив, это другой сценарий. (b) Если бы data был массивом, у него не было бы свойства data.posts, и даже если бы оно было, что заставляет вас думать, что data и data.posts имеют одинаковую длину? Что, если data.post короче data? (c) Why do you keep a useless variable k` в вашем примере? - person Felix Kling; 03.03.2012
comment
Да, ты прав, не видел твоего ответа. Я имел в виду, что data.posts будет массивом, содержащим объекты. Что касается k var, я поставил его вместо i, чтобы исправить код. - person dotoree; 03.03.2012