Simpy不能迭代javascript对象?

时间:2013-11-20 13:12:27

标签: javascript jquery

我已经搜索了其他问题/答案并实现了所有内容,但我仍然无法访问该对象的值。这是我正在使用的代码:

function apply_voucher(voucher) {
    var dates = $.parseJSON($("[name='dates']").val());
    var voucher_yes_no = new Array();
    var voucher_reduction = new Array();

    if(voucher.length > 0)
    {
        $.each(dates, function(room_id, these_dates) {
            $.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
                if(result.result == 'ok') {
                    voucher_yes_no.push('yes');
                    voucher_reduction.push(result.voucher_reduction);
                } else {
                    voucher_yes_no.push('no');
                }
            }, 'json');
        });

        // check if there are any yes's in the array
        if('yes' in voucher_yes_no) {
            console.log("no yes's");
        } else {
            console.log(voucher_reduction);
            console.log(typeof voucher_reduction);
            for (var prop in voucher_reduction) {
                console.log(prop);
                console.log(voucher_reduction[prop]);
                if (voucher_reduction.hasOwnProperty(prop)) { 
                    console.log("prop: " + prop + " value: " + voucher_reduction[prop]);
                }
            }
        }
    }
}

为常量console日志记录道歉 - 我只是想跟踪所有内容,以确保它们都在做它应该做的事情。我得到的控制台输出如下:

screenshot

...显示对象包含一个值"1.01"和我console.log的{​​{1}},以确保它实际上是一个对象(因为我以为我疯了在一个点上)。在此之后,for-in循环内部没有任何内容。我试过jquery的typeof也无济于事。我无法理解为什么我正在努力的工作正在发挥作用!

5 个答案:

答案 0 :(得分:1)

它不起作用,因为Ajax调用是异步的!

您正在阅读填充之前的值!

将代码移入并观察它会神奇地开始工作,因为它会在您实际填充数组后运行!

function apply_voucher(voucher) {
    var room_id = "169";
    var dates = $.parseJSON($("[name='dates']").val());
    var voucher_reduction = new Array();

    $.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
        if(result.result == 'ok') {
            voucher_reduction.push(result.voucher_reduction);
        }

        console.log(voucher_reduction);
        console.log(typeof voucher_reduction);
        for (var prop in voucher_reduction) {
                console.log(prop);
                console.log(voucher_reduction[prop]);
                if (voucher_reduction.hasOwnProperty(prop)) { 
                    console.log("prop: " + prop + " value: " + voucher_reduction[prop]);
                }
        }




    }, 'json');


}

从它看起来,你计划在循环中进行Ajax调用。为此,您需要等待所有请求完成。您需要使用when()then()。在另一个问题中回答:https://stackoverflow.com/a/9865124/14104

答案 1 :(得分:1)

对于未来的观众来说,改变我这样做的方式来使用适当的延迟对象和承诺,这让我头脑发热了一段时间,但我到了那里!感谢所有的帮助,特别是@epascarello指出我正确的方向:)一旦我开始这样做,阵列开始表现得像阵列一样,万岁!

这是最终的代码:

function apply_voucher(voucher) {
    var booking_id = $("[name='booking_id']").val();
    var dates = $.parseJSON($("[name='dates']").val());

    if(voucher.length > 0) {
        var data = []; // the ids coming back from serviceA
        var deferredA = blah(data, voucher, dates); // has to add the ids to data
        deferredA.done(function() { // if blah successful...
            var voucher_yes_no = data[0];
            var voucher_reduction = data[1];

            if(voucher_yes_no.indexOf("yes") !== -1)
            {
                console.log("at least one yes!");
                // change value of voucher_reduction field
                var reduction_total = 0;
                for(var i = 0; i < voucher_reduction.length; i++) {
                    reduction_total += voucher_reduction[i];
                }
                console.log(reduction_total);
            }
            else
            {
                console.log("there are no yes's");
            }
        });
    }
}

function blah(data, voucher, dates) {
    var dfd = $.Deferred();
    var voucher_yes_no = new Array();
    var voucher_reduction = new Array();
    var cycles = 0;
    var dates_length = 0;
    for(var prop in dates) {
        ++dates_length;
    }
    $.each(dates, function(room_id, these_dates) {
        $.post('/multiroom/check_voucher/'+voucher+'/'+room_id, function(result) {
            if(result.result == 'ok') {
                voucher_reduction.push(result.voucher_reduction);
                voucher_yes_no.push('yes');
            } else {
                voucher_yes_no.push('no');
            }
            ++cycles;
            if(cycles == dates_length) {
                data.push(voucher_yes_no);
                data.push(voucher_reduction);
                dfd.resolve();
            }
        }, 'json');
    });
    return dfd.promise();
}

答案 2 :(得分:0)

在这一行:

console.log(vouncher_reduction[prop]);
               ^

变量的名称是错误的(n),可能会破坏您的代码。

答案 3 :(得分:0)

您能说明如何定义voucher_reduction吗? 我想知道调试输出的第二行来自哪里,一个以'0'开头。

答案 4 :(得分:0)

我认为你的循环没有问题。 但也许与你的对象。

您确定哪些属性可枚举? 尝试执行此操作以检查:

Object.getOwnPropertyDescriptor(voucher_reduction,'0');

如果返回undefined,则该属性不存在。