2017-01-31 12 views
0

javascript私は入力ボックスに最大6個の整数のペアワイズ比較を自動化しようとしています.3個の数値が0.2以内になるまで数字を比較します。相互に0.2以内に3つの数値を入れるために6つの値をすべて入力する必要はないので、6つの潜在的な入力値の一部はnullまたは0のままですが、比較では無視する必要があります。Javascript Javascript 6個の変数の違いのペアごとの比較

変数を関数var fev1 = document.getElementById( 'fevOne')。valueにロードしましたが、可能性のあるすべてのケースを書き出すのではなく、それぞれを互いに比較する方法がわかりません。

私はこれにどのようにアプローチすべきか考えている人はいますか?背景のビットについて

私の非常に疎なコード例は以下である

....

<head> 
function reproduce() { 
var fev1 = document.getElementById('fevOne').value; 
var fev2 = document.getElementById('fevTwo').value; 
var fev3 = document.getElementById('fevThree').value; 
var fev4 = document.getElementById('fevFour').value; 
var fev5 = document.getElementById('fevFive').value; 
var fev6 = document.getElementById('fevSix').value; 
//essentially, I don't know where to begin in building this formula, but imagine that I would need to use a loop 
} 

</head> 
<body> 
<input type="text" name="fevOne" id="fevOne" value=""> 
<input type="text" name="fevTwo" id="fevTwo" value=""> 
<input type="text" name="fevThree" id="fevThree" value=""> 
<input type="text" name="fevFour" id="fevFour" value=""> 
<input type="text" name="fevFive" id="fevFive" value=""> 
<input type="text" name="fevSix" id="fevSix" value=""> 
</body> 

、Iは、肺機能測定が(1秒間に呼気量を強制するかどうかを特定する医療用フォームを構築していリットルで測定されたFEV1)は、十分な再現性(すなわち、互いに0.2L以内の3)で収集され、これらの3つの値のうち最高値が患者にとって保存された臨床的に適切な値として取られることを意図した。

ありがとうございました!

ロリー

答えて

0

一般的な考え方は、変化は入力の全ての組み合わせを比較し、ネストされたループ構造を使用して、それらのうちの一方に形成されているすべての入力をいつでもチェックすることになります。それは臨床使用のための弾丸証明でなければならず、技術者は心を変えて値を消去し、変更し、修正することができなければならない。スパイロメトリー検査が完了してすべての結果が入力された場合、この例は、2つの検査結果の差を最小限にするものではなく、同定された最大臨床的fevを報告する。

この例のHTMLは、 "id"プロパティではなく、ゼロベースの "data-index"属性を使用して各入力を識別していることに注意してください。 "fevSetup"関数は通常、スニペットを実行している間にウィンドウロードイベントが発生した後で直接呼び出されます。 JavaScriptの 小数点演算が必ずしも正確ではないため、最大の差はわずかに増加しました(私は報告者の方がより良いかもしれない技術者のテキスト入力を保存していません)。

function fevSetup() { 
 

 
    var MAX_DIFF = 0.2000001; 
 
    var values = []; 
 
    var i,j; 
 
    var fevInputs = document.querySelectorAll('[data-type=fev]'); 
 

 
    for(i = 0; i < fevInputs.length; ++i) { 
 
     fevInputs[i].addEventListener("change", checkFev); 
 
    } 
 

 
    function checkFev() { 
 
     var thisFev = Number(this.value); 
 
     var index = Number(this.dataset.index); 
 
     if(isNaN(thisFev) || thisFev <= 0) { 
 
      console.log("Invalid input: " + this.value) 
 
      this.value = ""; 
 
      thisFev = undefined; 
 
     } 
 
     values[ index] = thisFev // may erase a previous entry 
 

 
     var clinicalFevs = []; 
 
     for(var i = 0; i < values.length-1; ++i) { 
 
      for(var j = i+1; j < values.length; ++j) { 
 
       if(values[i] && values [j] 
 
       && (Math.abs(values[j] - values[i]) <= MAX_DIFF)) { 
 
        clinicalFevs.push(Math.max (values[i], values[j])); 
 
       } 
 
      } 
 
     } 
 
     if(clinicalFevs.length) { 
 
      var clinicalFev = Math.max.apply(Math, clinicalFevs); 
 
      console.log("Clinical Fev: %s", clinicalFev); 
 
     } 
 
    } 
 
} 
 

 
// window.addEventListent("load", fevSetup); 
 
fevSetup(); // for testing
<input type="text" data-type="fev" data-index="0" value=""> 
 
<input type="text" data-type="fev" data-index="1" value=""> 
 
<input type="text" data-type="fev" data-index="2" value=""> 
 
<input type="text" data-type="fev" data-index="3" value=""> 
 
<input type="text" data-type="fev" data-index="4" value=""> 
 
<input type="text" data-type="fev" data-index="5" value="">

は、当然のことながら、このコードは、保証や目的への適合の声明の任意のフォームなし、であるとして供給されています。しかし、それはあなたに何かを提供することを願っています。

1

クイックや汚れ:https://jsfiddle.net/8081wucv/2/

function check() { 
    var text = document.getElementById('check'); 

関数を宣言し、私は以上の配列とループを初期化テキスト

var values = []; 
    for (var i = 0; i < 6; i++) { 

    var value = document.getElementById('fev' + i).value; 
    if (/\d+\.?\d*/.test(value)) { 
     values.push(value); 
    } 
    } 

のビットを置く要素を取得要素。彼らは任意の点で、単に数字であれば、我々は簡単に次のチェックを行い、テストに合格したか否かと言うブール値を初期化することができますので、その後アレイ上に

values.sort(); 
    var passing = false; 

ソート配列を押し込みます。

for (var x = 0; x < values.length; x++) { 
    if (values[x + 2] - values[x] <= 0.2) { 
     passing = true; 
     break; 
    } 
    } 

アレイをループします。差が0.2以下である3つの要素(ソートされた配列内の2つの要素、この要素を差し引いた要素)がある場合、テストに合格します。

if (passing) { 
    text.innerHTML = 'passing'; 
    } else { 
    text.innerHTML = 'not passing'; 
    } 
}  

テキストを更新してください。

最後のブロックを削除し、機能が必要な場合は​​に変更することができます。

0

これについてはわかりませんが、Minとrecurseの比較はどうですか?

var inp = document.querySelectorAll('input'), // Jack's solution is more elegant. 
fevArray = []; 

[].forEach.call(inp, (e) => { 
    if (e.value) { 
    fevArray.push(parseFloat(e.value,10)); 
    } 
}); 

var recursiveCheck = function(arr){ 
    if (arr.length >= 3) { 
    // If Max and min difference is not in the interval, change max with the second greatest value and recurse. 
    if ((Math.max.apply(null, arr) - Math.min.apply(null, arr) <= 0.2)) { 
     return arr; 
    } 
    recursiveCheck(arr.splice(arr.indexOf(Math.max.apply(null, arr)),1)); 
    } 

}

console.log("result", recursiveCheck(fevArray)); // should return undefined if not meeting conditions, or the array otherwise. 
関連する問題