2017-01-31 8 views
0

В javascript Я пытаюсь автоматизировать попарное сравнение до 6 целых чисел в поле ввода, сравнивая числа по мере их ввода до тех пор, пока 3 числа не будут в пределах 0,2 друг от друга. Нет необходимости вводить все 6 значений, чтобы иметь три числа в пределах 0,2 друг от друга, поэтому некоторые из 6 потенциальных входных значений могут оставаться нулевыми или 0, но которые следует игнорировать при сравнении.Javascript попарительное сравнение для разности между 6 переменными

Я загрузил переменные в функцию, то есть var fev1 = document.getElementById ('fevOne'). Значение, но я не уверен, как идти о сравнении друг с другом, кроме того, чтобы выписывать каждый возможный случай.

Кто-нибудь есть идеи, как я должен подойти к этому?

Мой очень редкий пример кода ниже ....

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

Для немного фона, я строящему медицинскую форму, которая будет определять ли измерения функции легких (объем форсированного выдоха за 1 секунду, FEV1, измеренные в литрах) были собраны с достаточной воспроизводимостью (т. Е. 3 в пределах 0,2 л друг от друга) с намерением, чтобы наивысшее из этих 3 значений принималось как клинически значимое значение, хранимое для пациента.

Заранее благодарим за любую помощь!

Рори

ответ

0

Основная идея будет проверить все входы любое изменение производится к одному из них, используя вложенную структуру цикла, которая сравнивает все комбинации входов. Он должен быть пуленепробиваемым для клинического использования и позволяет техническим специалистам менять свое мнение и стирать, изменять и корректировать ценности.Обратите внимание, что если тесты спирометрии завершены и все результаты введены, в этом примере указывается максимальная клиническая частота, а не та, которая минимизирует разницу между двумя результатами теста.

Примечание. В этом примере HTML-код идентифицирует каждый вход, используя атрибут «data-index» на основе нуля, а не свойство «id». Функция «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; 
    } 
    } 

Петля над массивом. Если есть 3 элемента (2 элемента впереди, в отсортированном массиве, минус этот элемент), которые имеют разницу 0,2 или менее, тогда тест проходит.

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

Обновить текст.

Вы можете удалить последний блок и изменить его на return 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. 

 Смежные вопросы

  • Нет связанных вопросов^_^