0

我正在编写一个 javascript 递归函数,但总是给我 0 值。下面是我的代码片段和显示标记的屏幕截图:

    getOdometerEnd: function(object){
    var previous = jQuery(object).closest('tr').prevAll();
    var odometerEnd = parseInt(previous.find('input[name=odometer_end\\[\\]]').val());
    console.log(previous.find('input[name=destination\\[\\]]').val());
    if(odometerEnd == 0){
        this.getOdometerEnd(previous);
    }
    return odometerEnd;
},
updateOdometer: function(){
    var self = this;
    var distance = 0;
    var odometerStart = 0;
    var odometerEnd = 0;
    jQuery('.app-table tr').each(function(index, object){
        distance = jQuery(object).find('input[name=distance\\[\\]]').val();
        if(typeof distance != 'undefined' && distance > 0){
            if(index == 1){
                odometerStart = jQuery(object).find('input[name=vehicle_odometer\\[\\]]').val();
            }else {
                odometerStart = self.getOdometerEnd(object);
            }
            odometerEnd = parseInt(odometerStart)+parseInt(self.userDistance(distance));
            jQuery(object).find('input[name=odometer_start\\[\\]]').val(odometerStart);
            jQuery(object).find('input[name=odometer_end\\[\\]]').val(odometerEnd);
        }

    });
},

我不知道我在哪里弄错了,但它在倒数第二次递归时给了我正确的值,但最后它再次返回 0。请你帮帮我。我在此处附上了一张显示我的标记的图片。

PS Stack 溢出不允许我发布图片。或者,您可以在此处查看图片:http: //www.yourcarlog.com/odometer-problem.jpg

提前谢谢。

4

1 回答 1

0

首先,给元素类以使选择更容易和更快。按名称选择很麻烦。

其次,您会发现:

  • 维护一个正在运行的odo_cumulative变量,从而避免需要在表中查找有效的早期值odo_end.
  • 无条件地设置odo_startodo_end值,从而允许odo_cumulative通过空行传播。
  • (如果必须)执行第二次行扫描以清零odo_startodo_end空行。

替换updateOdometer为以下版本:

updateOdometer: function(){
    var self = this;
    var odo_cumulative;
    var $rows = jQuery('.app-table tr').each(function(index, tr){
        var $tr = jQuery(tr);
        if(!odo_cumulative) {
            odo_cumulative = parseInt($tr.find('input.vehicle_odometer').val());
        }
        var odo_start = odo_cumulative;
        var odo_cumulative = odo_end = parseInt(odo_start) + parseInt(self.userDistance($tr.find('input.distance').val()));
        $tr.find('input.odometer_start').val(odo_start);
        $tr.find('input.odometer_end').val(odo_end);
    });
    //Now, if you absolutely must, :) DESPITE BEING TOTALLY ILLOGICAL AND AGAINST ALL MY ADVICE :), scan the table rows again to zero out the start/end values where distance ==0;
    $rows.each(function(index, tr){
        var $tr = jQuery(tr);
        if(parseInt($tr.find('input.distance').val()) == 0){
            $tr.find('input.odometer_start, input.odometer_end').val(0);
        }
    });
},

未经测试

第三,该getOdometerEnd方法不再被调用,因此可以删除,除非其他地方需要。

编辑:

如果这可行,那么这个更简单,避免重复扫描的需要也应该如此:

updateOdometer: function(){
    var self = this,
        odo_cumulative;
    var $rows = jQuery('.app-table tr').each(function(index, tr){
        var $tr = jQuery(tr),
            $inputs = $tr.find('input'),
            distance = parseInt(self.userDistance($inputs.filter('.distance').val()));
        if(!odo_cumulative) {
            odo_cumulative = parseInt($inputs.filter('.vehicle_odometer').val());
        }
        $inputs.filter('.odometer_start').val((distance == 0) ? 0 : odo_cumulative);
        odo_cumulative += distance;
        $inputs.filter('.odometer_end').val((distance == 0) ? 0 : odo_cumulative);
    });
},

未经测试

于 2012-11-18T15:43:54.330 回答