通过$ .each函数TypeError迭代json

时间:2012-11-29 08:47:38

标签: php javascript jquery json each

我得到了php的回复:

{"success":false,"errors":{"category_id":"category id must not be empty","name":"name must not be empty","uri":"uri must not be empty","price":"price must not be empty","status":"status must not be empty"}}

并想要显示错误:

form.submit(function(ev) {
    ev.preventDefault();

    $('.help-inline').remove();

    var data = $(this).serialize();

    $.post($(this).attr('action'), {'data': data}, function(result) {

        if (result.success == true) {
            console.log('true');
        } else {
            $.each(result.errors, function(label, error) {
                console.log(label+' '+error);
            });
        }
    });
});

但它引发了我TypeError: e is undefined

在旧版本上它可以工作,但在1.8.3上则没有。 我做错了什么?

我的PHP代码是:

            $errors = $post->errors('');
            $this->response->body(json_encode(array(
                'success' => FALSE,
                'errors' => $errors,
            )));

$ errors是关联数组:

array(5) (
    "category_id" => string(29) "category id must not be empty"
    "name" => string(22) "name must not be empty"
    "uri" => string(21) "uri must not be empty"
    "price" => string(23) "price must not be empty"
    "status" => string(24) "status must not be empty"
)

3 个答案:

答案 0 :(得分:2)

您的result.errors是一个只包含一个元素的数组,您希望使用$.each进行迭代,所以只需替换以下行:

$.each(result.errors, function(label, error) {

这个:

$.each(result.errors[0], function(label, error) {

应该做你想做的事。

答案 1 :(得分:0)

在您的JSON中,您的errors数组似乎只包含一个元素,它是一个具有属性的对象,请尝试使用:

$.each(result.errors[0], function(label, error) {

答案 2 :(得分:0)

PHP和响应似乎没问题,但我不知道你会在哪里说javascript你会使用json数据类型。您可以在使用console.log(result)代码时验证。并查看您的结果是对象还是字符串。如

form.submit(function(ev) {
    ev.preventDefault();

    $('.help-inline').remove();

    var data = $(this).serialize();

    $.post($(this).attr('action'), {'data': data}, function(result) {
        console.log('Result is: ' + typeof(result));
        if (result.success === true) {
            console.log('true');
        } else {
            $.each(result.errors, function(label, error) {
                console.log(label+' '+error);
            });
        }
    });
}, "json");