2017-01-31 1 views
0

En javascript, j'essaie d'automatiser la comparaison par paires de jusqu'à 6 entiers dans les boîtes de saisie, en comparant les nombres entrés jusqu'à ce que 3 nombres soient à 0,2 l'un de l'autre. Il n'est pas nécessaire d'entrer toutes les 6 valeurs pour avoir trois nombres à l'intérieur de 0,2 l'un de l'autre, donc certaines des 6 valeurs d'entrée potentielles peuvent rester nulles ou nulles, mais qui devraient être ignorées dans les comparaisons.Comparaison par paire Javascript pour la différence entre 6 variables

J'ai chargé les variables dans une fonction à savoir var fev1 = document.getElementById ('fevOne'). Value, mais je ne suis pas sûr de savoir comment comparer les unes par rapport aux autres en dehors de chaque cas possible.

Est-ce que quelqu'un a une idée de comment je devrais aborder cela?

Mon code exemple très clairsemée est inférieure ....

<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> 

Pour un peu de fond, je construis un formulaire médical qui déterminera si les mesures de la fonction pulmonaire (volume expiratoire maximal en 1 seconde, FEV1, mesurés en Litres) ont été collectés avec une reproductibilité suffisante (c'est-à-dire 3 à moins de 0,2 L l'un de l'autre), avec l'intention que la valeur la plus élevée soit prise comme valeur cliniquement pertinente pour le patient.

Merci d'avance pour toute aide!

Rory

Répondre

0

L'idée générale serait de vérifier toutes les entrées à chaque fois qu'un changement est apporté à l'un d'entre eux en utilisant une structure de boucle imbriquée qui compare toutes les combinaisons d'entrées. Il doit être à l'épreuve des balles pour une utilisation clinique et permettre aux techniciens de changer d'avis, d'effacer, de modifier et de corriger les valeurs.Notez que si les tests de spirométrie ont été terminés et que tous les résultats sont entrés, cet exemple rapporte la fréquence clinique maximale identifiée, et non celle qui minimise la différence entre deux résultats de test.

Notez que le code HTML de cet exemple identifie chaque entrée à l'aide d'un attribut "index de données" basé sur zéro, et non de la propriété "id". La fonction "fevSetup" est normalement appelée après que l'événement de chargement de fenêtre a été déclenché alors que l'extrait s'exécute directement. La différence maximale a été légèrement augmentée car l'arithmétique décimale de JavaScript n'est pas toujours exacte (je n'ai pas stocké la saisie de texte par le technicien, ce qui pourrait être mieux à des fins de reporting).

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="">

Bien entendu, ce code est fourni en l'état, sans aucune forme de garantie ou déclaration d'aptitude à. J'espère cependant que cela vous donnera quelque chose à faire.

1

rapide et sale: https://jsfiddle.net/8081wucv/2/

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

déclarer la fonction et obtenir l'élément où je vais mettre le peu de texte

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

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

Initialiser le tableau et la boucle sur la éléments. S'ils sont juste des chiffres avec un point en option, puis poussez-le sur le tableau

values.sort(); 
    var passing = false; 

Trier le tableau afin que nous puissions faire le prochain contrôle facilement et initialiser le booléen qui indique si oui ou non le test passé.

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

Boucle sur la baie. S'il y a 3 éléments (2 éléments en avant, dans le tableau trié, moins cet élément) qui ont une différence de 0.2 ou moins alors le test passe.

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

Mise à jour du texte.

Vous pouvez supprimer le dernier bloc et le changer à return passing; si vous voulez juste une fonction.

0

Vous ne savez pas à ce sujet, mais qu'en est-il de comparer Min et 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.