#javascript
#javascript
Вопрос:
Я хотел бы упростить этот код, удалив все эти регистры переключателей (которые делают это очень громоздким, и я хотел бы сократить это, если это вообще возможно), одну функцию и / или все, что можно было бы использовать для удаления этих повторений if.
Это мой код:
function hemoglobine() {
hemoglobineInput.addEventListener('input', () => {
let hemoglobineContainerValue = document.querySelector('#hemoglobina').value;
switch(true) {
case (ageGroup === 0 amp;amp; (hemoglobineContainerValue > 2 amp;amp; hemoglobineContainerValue <= 6.9)):
hemoglobineValue = 'AST';
break;
case (ageGroup === 0 amp;amp; (hemoglobineContainerValue > 6.9 amp;amp; hemoglobineContainerValue <= 7.9)):
hemoglobineValue = 'AS';
break;
case (ageGroup === 0 amp;amp; (hemoglobineContainerValue > 7.9 amp;amp; hemoglobineContainerValue <= 11.4)):
hemoglobineValue = 'AM';
break;
case (ageGroup === 0 amp;amp; (hemoglobineContainerValue > 11.4 amp;amp; hemoglobineContainerValue <= 13.4)):
hemoglobineValue = 'AL';
break;
case (ageGroup === 0 amp;amp; (hemoglobineContainerValue > 13.4 amp;amp; hemoglobineContainerValue <= 19.8)):
hemoglobineValue = 'HN';
break;
case (ageGroup === 0 amp;amp; (hemoglobineContainerValue > 19.8)):
hemoglobineValue = 'PL';
break;
case (ageGroup === 1 amp;amp; (hemoglobineContainerValue > 2 amp;amp; hemoglobineContainerValue <= 6.9)):
hemoglobineValue = 'AST';
break;
case (ageGroup === 1 amp;amp; (hemoglobineContainerValue > 6.9 amp;amp; hemoglobineContainerValue <= 7.9)):
hemoglobineValue = 'AS';
break;
case (ageGroup === 1 amp;amp; (hemoglobineContainerValue > 7.9 amp;amp; hemoglobineContainerValue <= 9.9)):
hemoglobineValue = 'AM';
break;
case (ageGroup === 1 amp;amp; (hemoglobineContainerValue > 9.9 amp;amp; hemoglobineContainerValue <= 10.9)):
hemoglobineValue = 'AL';
break;
case (ageGroup === 1 amp;amp; (hemoglobineContainerValue > 10.9 amp;amp; hemoglobineContainerValue <= 13)):
hemoglobineValue = 'HN';
break;
case (ageGroup === 1 amp;amp; (hemoglobineContainerValue > 13)):
hemoglobineValue = 'PL';
break;
case (ageGroup === 2 amp;amp; (hemoglobineContainerValue > 2 amp;amp; hemoglobineContainerValue <= 6.9)):
hemoglobineValue = 'AST';
break;
case (ageGroup === 2 amp;amp; (hemoglobineContainerValue > 6.9 amp;amp; hemoglobineContainerValue <= 7.9)):
hemoglobineValue = 'AS';
break;
case (ageGroup === 2 amp;amp; (hemoglobineContainerValue > 7.9 amp;amp; hemoglobineContainerValue <= 9.9)):
hemoglobineValue = 'AM';
break;
case (ageGroup === 2 amp;amp; (hemoglobineContainerValue > 9.9 amp;amp; hemoglobineContainerValue <= 11.4)):
hemoglobineValue = 'AL';
break;
case (ageGroup === 2 amp;amp; (hemoglobineContainerValue > 11.4 amp;amp; hemoglobineContainerValue <= 15)):
hemoglobineValue = 'HN';
break;
case (ageGroup === 2 amp;amp; (hemoglobineContainerValue > 15)):
hemoglobineValue = 'PL';
break;
case (ageGroup === 3 amp;amp; (hemoglobineContainerValue > 2 amp;amp; hemoglobineContainerValue <= 6.9)):
hemoglobineValue = 'AST';
break;
case (ageGroup === 3 amp;amp; (hemoglobineContainerValue > 6.9 amp;amp; hemoglobineContainerValue <= 7.9)):
hemoglobineValue = 'AS';
break;
case (ageGroup === 3 amp;amp; (hemoglobineContainerValue > 7.9 amp;amp; hemoglobineContainerValue <= 10.4)):
hemoglobineValue = 'AM';
break;
case (ageGroup === 3 amp;amp; (hemoglobineContainerValue > 10.4 amp;amp; hemoglobineContainerValue <= 12.4)):
hemoglobineValue = 'AL';
break;
case (ageGroup === 3 amp;amp; (hemoglobineContainerValue > 12.4 amp;amp; hemoglobineContainerValue <= 16)):
hemoglobineValue = 'HN';
break;
case (ageGroup === 3 amp;amp; (hemoglobineContainerValue > 16)):
hemoglobineValue = 'PL';
break;
case (ageGroup === 4 amp;amp; (hemoglobineContainerValue > 2 amp;amp; hemoglobineContainerValue <= 6.9)):
hemoglobineValue = 'AST';
break;
case (ageGroup === 4 amp;amp; (hemoglobineContainerValue > 6.9 amp;amp; hemoglobineContainerValue <= 7.9)):
hemoglobineValue = 'AS';
break;
case (ageGroup === 4 amp;amp; (hemoglobineContainerValue > 7.9 amp;amp; hemoglobineContainerValue <= 9.9)):
hemoglobineValue = 'AM';
break;
case (ageGroup === 4 amp;amp; (hemoglobineContainerValue > 9.9 amp;amp; hemoglobineContainerValue <= 11.9)):
hemoglobineValue = 'AL';
break;
case (ageGroup === 4 amp;amp; (hemoglobineContainerValue > 11.9 amp;amp; hemoglobineContainerValue <= 16)):
hemoglobineValue = 'HN';
break;
case (ageGroup === 4 amp;amp; (hemoglobineContainerValue > 16)):
hemoglobineValue = 'PL';
break;
case (ageGroup === 5 amp;amp; (hemoglobineContainerValue > 2 amp;amp; hemoglobineContainerValue <= 6.9)):
hemoglobineValue = 'AST';
break;
case (ageGroup === 5 amp;amp; (hemoglobineContainerValue > 6.9 amp;amp; hemoglobineContainerValue <= 7.9)):
hemoglobineValue = 'AS';
break;
case (ageGroup === 5 amp;amp; (hemoglobineContainerValue > 7.9 amp;amp; hemoglobineContainerValue <= 10.4)):
hemoglobineValue = 'AM';
break;
case (ageGroup === 5 amp;amp; (hemoglobineContainerValue > 10.4 amp;amp; hemoglobineContainerValue <= 12.9)):
hemoglobineValue = 'AL';
break;
case (ageGroup === 5 amp;amp; (hemoglobineContainerValue > 12.9 amp;amp; hemoglobineContainerValue <= 18)):
hemoglobineValue = 'HN';
break;
case (ageGroup === 5 amp;amp; (hemoglobineContainerValue > 18)):
hemoglobineValue = 'PL';
break;
default:
hemoglobineValue = 'NONE';
}
});
}
Я подумал, что это может быть способ создания словаря путем присвоения объектов key / value, но я не уверен, как это сделать правильно. Все подсказки будут оценены!
Ответ №1:
Если вы создадите массив, проиндексированный по ageGroup
, значениями которого являются объекты, содержащие hemoglobineValue
и связанный с ним нижний порог для этой возрастной группы, вы можете перебирать записи объекта до .find
первой соответствующей записи:
const hValues = [
// Age group 0:
{
AST: 6.9,
AS: 7.9,
AM: 11.4,
AL: 13.4,
HN: 19.8,
PL: 100
},
// Age group 1:
{
AST: 6.9,
AS: 7.9,
AM: 9.9,
AL: 10.9,
HN: 13,
PL: 100
}
// etc
]
function hemoglobine() {
hemoglobineInput.addEventListener('input', () => {
const input = Number(document.querySelector('#hemoglobina').value);
const entry = Object.entries(hValues[ageGroup])
.find(([, threshold]) => input <= threshold);
const hemoglobineContainerValue = entry[0];
});
}
Вы также можете использовать массив массивов вместо массива объектов, hValues
чтобы сделать вещи более краткими, и иметь отдельный массив, содержащий hemoglobineValue
строки, но ИМО, что структура данных будет немного сложнее понять с первого взгляда.
Ответ №2:
Я это делаю…
const agArr = [0,1,2,3,4,5]
const hvArr =
[ { hv_min: 2, hv_max: 6.9, res: 'AST' }
, { hv_min: 6.9, hv_max: 7.9, res: 'AS' }
, { hv_min: 7.9, hv_max: 10.4, res: 'AM' }
, { hv_min: 10.4, hv_max: 12.9, res: 'AL' }
, { hv_min: 12.9, hv_max: 18, res: 'HN' }
, { hv_min: 18, hv_max: Infinity, res: 'PL' }
]
function get_hgv(ageGroup, hemoglobineContainerValue)
{
return !agArr.includes(ageGroup)
? 'NONE'
: hvArr.find(x => hemoglobineContainerValue > x.hv_min
amp;amp; hemoglobineContainerValue <= x.hv_max
)?.res ?? 'NONE';
}
console.log ('4,8 ->', get_hgv(4,8) ) // AM
console.log ('4,12 ->', get_hgv(4,12) ) // AL
console.log ('4,0 ->', get_hgv(4,0) ) // NONE
console.log ('9,8 ->', get_hgv(9,8) ) // NONE
.as-console-wrapper { max-height: 100% !important; top: 0; }