1

jsFiddle --> http://jsfiddle.net/rVLN2/1/

私は初心者です。スクリプトが非効率的であることはわかっていますが、それに取り組んでいます。次のようなオブジェクト配列のセットアップがあります。

var SatWaterMetric = [
  {"T":0,"Psat":0.6117,"vf":0.001,"vg":206,"hf":0.001,"hfg":2500.9,"hg":2500.9},
  {"T":5,"Psat":0.8725,"vf":0.001,"vg":147.03,"hf":21.02,"hfg":2489.1,"hg":2510.1},
  {"T":10,"Psat":1.2281,"vf":0.001,"vg":106.32,"hf":42.022,"hfg":2477.2,"hg":2519.2},
  ...................................];

次に、html から値を取得し、表に従って数値を補間する関数があります。

 function interpolate(myval, unit) {

    if (unit == "T") {
        for (var i=0;i<SatWaterMetric.length;i++) {
            if (myval < SatWaterMetric[i].T) {

                T_low = SatWaterMetric[i-2].T;
                T_high = SatWaterMetric[i-1].T;

                Psat_low = SatWaterMetric[i-2].Psat;
                Psat_high = SatWaterMetric[i-1].Psat;                    

                vf_low = SatWaterMetric[i-2].vf;
                vf_high = SatWaterMetric[i-1].vf;

                vg_low = SatWaterMetric[i-2].vg;
                vg_high = SatWaterMetric[i-1].vg;

                hf_low = SatWaterMetric[i-2].hf;
                hf_high = SatWaterMetric[i-1].hf;

                hfg_low = SatWaterMetric[i-2].hfg;
                hfg_high = SatWaterMetric[i-1].hfg;

                hg_low = SatWaterMetric[i-2].hg;
                hg_high = SatWaterMetric[i-1].hg;

                var factor = (myval - T_low) / (T_high - T_low);

                Psatx = (1 * Psat_low) + ( 1 * factor * (Psat_high - Psat_low));
                vfx = (1 * vf_low) + ( 1 * factor * (vf_high - vf_low)); 
                vgx = (1 * vg_low) + ( 1 * factor * (vg_high - vg_low)); 
                hfx = (1 * hf_low) + ( 1 * factor * (hf_high - hf_low)); 
                hfgx = (1 * hfg_low) + ( 1 * factor * (hfg_high - hfg_low)); 
                hgx = (1 * hg_low) + ( 1 * factor * (hg_high - hg_low));
                Tx = myval;
                break;
            }
        }

        $('#txtpsat').val(Math.round(Psatx*100000)/100000);
        $('#txtvf').val(Math.round(vfx*10000000)/10000000);
        $('#txtvg').val(Math.round(vgx*100000)/100000);
        $('#txthf').val(Math.round(hfx*10000)/10000);
        $('#txthg').val(Math.round(hgx*100)/100);
        $('#txthfg').val(Math.round(hfgx*100)/100);

    } else if (unit == "Psat") {

        //Repeat everything but for Psat

    } else if (unit == "vf") {

        //Repeat everything but for vf

               } else {}
}

});

これは、「T」がわかっている場合にのみ値を解決するためのものです。入力された値 (「Psat」、「vg」、「vf」など) を判別し、その値に基づいて他のすべての数値を評価するプログラムを作成しようとしています。私が現在このようにセットアップしている方法では、基本的に、Psat、vg、vf、hg、hf、および hfg に対してすべてのコードを繰り返す必要があります。非常に効率が悪いようです。これを 1 つの滑らかな関数に切り詰める方法はありますか? .

. jsFiddle --> http://jsfiddle.net/rVLN2/1/

.

4

3 に答える 3

4

JavaScript の非常に優れた機能が欠けています。

obj.Prop

と同じです

obj['Prop']

したがって、値のキーとしてユニットを使用するだけです。

于 2013-09-05T19:30:04.127 に答える
1

前述のように、オブジェクトのプロパティの参照は、ドット表記と配列表記の両方を使用して実行できるという事実を利用できます。

これをさらに進めると、incoming へのアクセスを単純化できるだけでなくunit、コードの残りの部分をかなり削減することもできます。

まず、マークアップを少し変更すると、すべての入力フィールド ID が同じパターン "txt" + key.toLowerCase() になります。

<input type='text' size='8' id='txtt'/>

定義済みの大きさで highLow 値のオブジェクトを初期化します (T にはそれがありません)。

var highLow = {
    T:    {},
    Psat: {magnitude: 100000},
    vf:   {magnitude: 10000000},
    vg:   {magnitude: 100000},
    hf:   {magnitude: 10000},
    hg:   {magnitude: 100},
    hfg:  {magnitude: 100}
};

次に、補間関数の残りの部分を次のように変更できます。

// Note 1: Started loop at 2 to avoid undefined array values
// Note 2: the redundant loops could be reduced by calculating T first
function interpolate(myval, unit) {
    var key, cur, factor;

    var highLow = {/*see above*/};

    for (var i = 2; i < SatWaterMetric.length; i++) {
        if (myval < SatWaterMetric[i][unit]) {
            for (key in highLow) {
                highLow[key].low = SatWaterMetric[i - 2][key];
                highLow[key].high = SatWaterMetric[i - 1][key];
            }

            factor = (myval - highLow.T.low) / (highLow.T.high - highLow.T.low);

            for (key in highLow) {
                cur = highLow[key];

                // This is T
                if (!cur.magnitude) {
                    cur.result = myval;
                } else {
                    cur.result = (1 * cur.low) + (1 * factor * (cur.high - cur.low));
                }
            }
            break;
        }
    }

    for (key in highLow) {
        cur = highLow[key];
        $('#txt' + key.toLowerCase()).val(Math.round(cur.result * (cur.magnitude || 1)) / (cur.magnitude || 1));
    }
}

デモjsFiddle


バージョン 2: このバージョンでは、表示計算をリファクタリングし、関連する highLow キーに直接割り当てて、最終的な表示値をインラインで計算することにより、前の例から冗長なループを取り除きます。

デモjsFiddle

コード:

// Generates a result for display using the provided magnitude to 
// format the calculated value.
function calcFn(T, factor, low, high, magnitude) {
    var retVal = (1 * low) + (1 * factor * (high - low));

    return Math.round(retVal * (magnitude || 1)) / (magnitude || 1);
}

var highLow = {
    // Initializing T with a calc function that just returns the passed in value
    // This makes the calc/display loop much simpler
    T:    { calc:   function(T) { return T; }, 
            factor: function(T, low, high) { return (T - low) / (high - low); } },

    // All other metrics will use calcFn
    Psat: { magnitude:   100000, calc: calcFn },
    vf:   { magnitude: 10000000, calc: calcFn },
    vg:   { magnitude:   100000, calc: calcFn },
    hf:   { magnitude:    10000, calc: calcFn },
    hg:   { magnitude:      100, calc: calcFn },
    hfg:  { magnitude:      100, calc: calcFn }
};

// Note: Started loop at 2 to avoid undefined array values
function interpolate(myval, unit) {
    var key, cur, factor, result, high, low;

    for (var i = 2; i < SatWaterMetric.length; i++) {
        if (myval < SatWaterMetric[i][unit]) {
            // T is in slot 0
            factor = highLow.T.factor(myval, SatWaterMetric[i - 2].T, SatWaterMetric[i - 1].T);

            // Now we can simply loop through all metrics using the assigned calc function to 
            // generate a result for display.
            for(key in highLow) {
                cur    = highLow[key];
                low    = SatWaterMetric[i - 2][key];
                high   = SatWaterMetric[i - 1][key];
                result = cur.calc(myval, factor, low, high, cur.magnitude);

                $('#txt' + key.toLowerCase()).val(result);
            }

            break;
        }
    }
}
于 2013-09-05T20:25:25.480 に答える
1

私はそれに殴られました!さて、とにかく実装は...

SatWaterMetric[i].Tに変更SatWaterMetric[unit]:

jsFiddle。_

function interpolate(myval, unit) {
            for (var i=0;i<SatWaterMetric.length;i++) {
                if (myval < SatWaterMetric[i][unit]) {

                    T_low = SatWaterMetric[i-2].T;
                    T_high = SatWaterMetric[i-1].T;

                    Psat_low = SatWaterMetric[i-2].Psat;
                    Psat_high = SatWaterMetric[i-1].Psat;                    

                    vf_low = SatWaterMetric[i-2].vf;
                    vf_high = SatWaterMetric[i-1].vf;

                    vg_low = SatWaterMetric[i-2].vg;
                    vg_high = SatWaterMetric[i-1].vg;

                    hf_low = SatWaterMetric[i-2].hf;
                    hf_high = SatWaterMetric[i-1].hf;

                    hfg_low = SatWaterMetric[i-2].hfg;
                    hfg_high = SatWaterMetric[i-1].hfg;

                    hg_low = SatWaterMetric[i-2].hg;
                    hg_high = SatWaterMetric[i-1].hg;

                    var factor = (myval - T_low) / (T_high - T_low);

                    Psatx = (1 * Psat_low) + ( 1 * factor * (Psat_high - Psat_low));
                    vfx = (1 * vf_low) + ( 1 * factor * (vf_high - vf_low)); 
                    vgx = (1 * vg_low) + ( 1 * factor * (vg_high - vg_low)); 
                    hfx = (1 * hf_low) + ( 1 * factor * (hf_high - hf_low)); 
                    hfgx = (1 * hfg_low) + ( 1 * factor * (hfg_high - hfg_low)); 
                    hgx = (1 * hg_low) + ( 1 * factor * (hg_high - hg_low));
                    Tx = myval;
                    break;
                }
            }

            $('#txtpsat').val(Math.round(Psatx*100000)/100000);
            $('#txtvf').val(Math.round(vfx*10000000)/10000000);
            $('#txtvg').val(Math.round(vgx*100000)/100000);
            $('#txthf').val(Math.round(hfx*10000)/10000);
            $('#txthg').val(Math.round(hgx*100)/100);
            $('#txthfg').val(Math.round(hfgx*100)/100);
    }
于 2013-09-05T19:31:09.917 に答える