2013-09-05 7 views
1

jsFiddle ->http://jsfiddle.net/rVLN2/1/Javascript 객체 배열을 문자열로 변환 하시겠습니까?

나는 멍청한 행동이다. 나는 스크립트가 비효율적이지만 잘 작동하고있다.

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}, 
    ...................................]; 

그럼 I는 HTML에서 값을 구해 표에 따른 숫자 값을 보간하는 기능을 갖는다 : I과 같은 객체 어레이 구성을 갖는다.

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에 대한 코드를 모두 반복해야합니다. 그것은 매우 비효율적 인 것처럼 보입니다. 이것을 하나의 부드러운 함수로 트리밍하는 방법이 있습니까? .

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

+1

부정적인 인덱스 -> I-2 – zsong

+0

예 부정적인 인덱스입니다. 하지만 그건 내가 묻는 것과 아무런 관련이 없다. – Sanya

+0

OMG, dude,'SatWaterMetric [i-2]'는'undefined'가 될 것이고'SatWaterMetric [i-2] .T'는 지옥에있을 것입니다. 'T'가 알려지지 않은 것이 아니라 코드가 작동하지 않습니다. – zsong

답변

1

, 당신은 객체의 속성을 참조하는 것은 도트 및 배열 표기를 모두 사용하여 수행 할 수 있다는 사실을 활용할 수 있습니다.

이 코드를 조금 더 사용하면 수신 unit에 대한 액세스를 단순화 할 수있을뿐만 아니라 나머지 코드도 상당히 줄일 수 있습니다.

먼저 마크 업을 약간 변경하면 모든 입력 필드 ID의 패턴이 동일한 "txt"+ 키가됩니다.와 toLowerCase() :

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

는 (T 하나가없는) 미리 정의 된 크기로 highLow 값의 객체를 초기화 :

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

Demo jsFiddle


버전 2 :이 버전은 디스플레이 계산을 리팩토링하고 연관된 하이 로우 키에 직접 할당하고 최종 디스플레이 값을 인라인으로 계산하여 이전 예의 중복 루프를 제거합니다.

Demo 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; 
     } 
    } 
} 
4

자바 스크립트의 멋진 기능이 누락되었습니다.

obj.Prop 

방금 ​​값에 대한 키로 장치를 사용한다 무엇을해야 그래서

obj['Prop'] 

, 동일합니다.

+0

명확히하기 위해 : 두 번째 방법에서 변수를 사용할 수 있습니다 :'var type = 'T'; 스위치 (obj [type]) {// stuff}' –

+0

매우 흥미 롭습니다! 나는 이것에 관해 더 많이 읽어야 할 것이다! 고맙습니다 – Sanya

1

나는 그것에 맞았다! 음, 여기 SatWaterMetric[unit]

변경 ... SatWaterMetric[i].T 어쨌든 구현의 :

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