在jquery中将for循环与.each()结合起来

时间:2015-04-12 08:14:34

标签: javascript jquery

我在尝试在发送查询时在表中显示json数据。请求工作正常,一切都很好地显示。但: 当我尝试显示内容时,jquery抛出一个TypeError:a是未定义的。

第一次加载页面时内容会正确显示,但是当通过表单发送另一个请求时,内容会拒绝更新。我只想将表行附加到HTML中的表:

<table id="table"></table>
JS看起来像这样:

            for (var id = 0; id < 150; id++) {
                showItems(id);
            }

            function showItems(){
                $.each(json.list.item[id], function(i, val) {
                    var $r = $('<tr>');
                    var $c = $('<td>').text(i).appendTo($r);
                    $c = $('<td>').text(val).appendTo($r);
                    $("#table").append($r);
                });
            }

我很确定它与从for循环传递给每个函数的id有关,但我不知道如何解决这个问题。由于JS在for循环中没有块范围,因此id变量应该可以在$ .each()中访问吗? 但是我无法理解为什么jquery会把我扔掉,因为#a; a is undefined&#34;错误和脚本不会反应,直到页面重新加载。我认为它可能是一个未定义的变量返回Null,但我不知道哪个。

无法在这里和网上阅读大量答案(也是关于JS变量范围和闭包)来找出解决方案。

http://jshint.com/除了jquery $ S外,没有显示任何未定义的变量。

非常感谢帮助:)

修改 _id修复没有帮助。这是整个js代码。

$(document).ready(function(){


$("#term").focus(function() {

    var full = $("#table > tbody > tr").length? true : false;
    if(full == false) {
        $("#message").empty();
        $("#table").empty();
    }
});

var getFood = function(){

    var food = $('#term').val();

    if(food ==''){

        $('#message').html("Ha! We haven't seen you type, so no request! Type something!<hr>");
    } else {

        $('#message').html("Your information is on its way!<hr>");

        $.getJSON("APICALL", function(json){
            console.log(json);

            for (var id = 0; id < 150; id++) {
                showItems(id);
            }

            function showItems(){

                $.each(json.list.item[id], function(i, val) {
                    var $r = $('<tr>');
                    var $c = $('<td>').text(i).appendTo($r);
                    $c = $('<td>').text(val).appendTo($r);
                    $("#table").append($r);
                });
            }

        });
    }
};

$('#search').click(getFood);
});

当我省略for循环但是只使用:

                $.each(json.list.item[0], function(i, val) {
                    var $r = $('<tr>');
                    var $c = $('<td>').text(i).appendTo($r);
                    $c = $('<td>').text(val).appendTo($r);
                    $("#table").append($r);
                });

要仅显示第一个对象,它才能正常工作,不会抛出任何错误。这让我觉得它与for / .each()连接有关。

编辑2:解决方案

在下面的表格中应用@ MM-tac提出的代码并完美运行:

        $.each(json.list.item, function (key, data) {
            console.log(key)
            $.each(data, function(index, data) {
                var $r = $('<tr>');
                var $c = $('<td>').text(index).appendTo($r);
                $c = $('<td>').text(data).appendTo($r);
                $("#table").append($r);
            });
        });

4 个答案:

答案 0 :(得分:2)

您需要以这种方式为每个对象使用不同的$.each

$.each(json, function (key, data) {
    console.log(key)
    $.each(data, function (index, data) {
        console.log('index', data)
    })
})

答案 1 :(得分:0)

您有什么要求?目前,您正在通过&#39; id&#39;进入你的功能&#39; showItems&#39; (它实际上没有输入参数)。

遍历你的代码,你有一个for循环调用你的函数150次,每次都有不同的索引。但这本身就是每个人的目的。如何构建json.list.item?如果它是嵌套的,并且你在数组数组中循环,这可能会起作用(尽管它的编写方式起初有点不清楚。)

此外,您不需要为$ c分配任何内容,因为这些命令会立即执行追加操作。

如果您对我的意见有所了解,我可能会帮助您更多。

答案 2 :(得分:0)

        for (var id = 0; id < 150; id++) {
            showItems(id);
        }

        function showItems(id){
            $.each(json.list.item[id], function(i, val) {
                var $r = $('<tr>');
                var $c = $('<td>').text(i).appendTo($r);
                $c = $('<td>').text(val).appendTo($r);
                $("#table").append($r);
            });
        }

如果您添加function showItems(id)而不是function showItems(),则each()实际上会有一些内容可循环播放。

答案 3 :(得分:0)

修正了此代码的问题:

            $.each(json.list.item, function (key, data) {
                console.log(key)
                $.each(data, function(index, data) {
                    var $r = $('<tr>');
                    var $c = $('<td>').text(index).appendTo($r);
                    $c = $('<td>').text(data).appendTo($r);
                    $("#table").append($r);
                });
            });

感谢大家帮助我。非常感激。 Stackoverflow社区真的很棒。