JSON 循环只有 1 个结果

Only 1 result from JSON loop

有人可以解释一下为什么只返回 1 个结果(应该有 4 个)。它只返回最新的 post 标题,我想在其中获取类别 (ID: 121) 中的所有 post 标题,在本例中是四个。

<script type="text/javascript">
            var posturl = "http://www.tropical420.com/api/get_posts/?posts_per_page=-1";

            $.ajax({

                type: 'GET',
                url: posturl,
                complete: function(){                    
                },
                success: function (data) {

                    var response = data; //JSON.parse(data);

                    //loop through posts
                    for(var i = 0; i != response.posts.length; i++) {

                    //get each element in the array
                    var post = response.posts[i];

                    // post vars
                    var postTitle   = post.title;
                    var postContent = post.content;
                    var postCategory = post.categories[i].id;

                    // output stuff so we can see things


                        if (postCategory == '121') {
                            $("#post").append(postTitle + "<br />").trigger('create');
                        }

                    }

                },
                error:function (xhr, ajaxOptions, thrownError) {                    
                    alert("Error");

                }

            });
         </script>

<div id="post"></div>

您遇到的问题是您没有遍历所有类别,而只是引用与您的帖子数组相同的索引。您应该像这样遍历所有类别

var postCategories= post.categories;

for (var postCategoryIndex in postCategories)
{
    var postCategory = postCategories[postCategoryIndex].id;
    if (postCategory == '121') {
      $("#post").append(postTitle + "<br />").trigger('create');
    }
}

返回的JSON确实包含49个帖子,如果你试过就会知道console.log(response.posts.length)

sanfor 已经指出了你代码中的逻辑错误,但是你的整个回调函数可以写得更干净,像这样:

function (data) {
    data.posts.filter(function (post) {
        return post.categories.filter(function (cat) { return cat.id === '121'; });
    }).forEach(function (post) {
        $("#post").append(post.title + "<br />").trigger('create');
    });
}