Замена нескольких регистров переключения при проверке нескольких диапазонов целых чисел

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