开发者问题收集

在 jquery 中将 for 循环与 .each() 结合使用

2015-04-12
948

我尝试在发送查询时在表中显示 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 循环传递到 each 函数的 id 有关,但我不知道如何解决这个问题。由于 JS 在 for 循环中没有块作用域,因此 id 变量应该可以在 $.each() 中访问,对吗? 但是我无法弄清楚为什么 jquery 会抛出“a 未定义”错误,并且脚本直到页面重新加载才会做出反应。我认为可能是某个未定义的变量返回了 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);
            });
        });
3个回答

您需要对每个对象使用不同的 $.each ,如下所示:

$.each(json, function (key, data) {
    console.log(key)
    $.each(data, function (index, data) {
        console.log('index', data)
    })
})
immayankmodi
2015-04-12

您的输入是什么?目前,您正在将“id”传递给函数“showItems”(它实际上没有输入参数)。

遍历您的代码,您有一个 for 循环调用您的函数 150 次,每次使用不同的索引。但这本质上是每个函数的目的。json.list.item 是如何构造的?如果它是嵌套的,并且您正在循环遍历一个数组数组,那么这可能会起作用(尽管它的编写方式一开始有点不清楚)。

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

如果您能让我深入了解您的输入,我可能会为您提供更多帮助。

ChadF
2015-04-12
        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() 实际上会有一些要循环的内容。

Drazisil
2015-04-12