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);
        }

    });
},

どこを間違えたのかわかりませんが、最後から2番目の再帰で正しい値が得られますが、最後に再び0が返されます。助けてください。ここにマークアップを示す画像を添付しました。

PS スタック オーバーフローにより、画像を投稿できませんでした。または、ここで画像を表示することもできます: http://www.yourcarlog.com/odometer-problem.jpg

事前にサンクス。

4

1 に答える 1

0

まず、要素のクラスを指定して、選択をより簡単かつ迅速にします。名前による選択は面倒です。

第二に、次のことを行う方がはるかに簡単で、おそらくそれほど効率的ではないことがわかります。

  • 実行中の変数を維持するodo_cumulativeため、有効な以前の値のテーブルを盗聴する必要がなくなりますodo_end
  • odo_startとのodo_end値を無条件に設定して、 odo_cumulativenull 行を介して伝播できるようにします。
  • (必要に応じて) 2 回目の行スキャンを実行して、ゼロ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);
        }
    });
},

テストされていない

第 3 に、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 に答える