With lookup table, the code is cleaner, much easier to read and very easy to extend.

Example of nested if-else

if hot then
  if latte then
     if cl then 
         hot caramel latte
     else if...
   else if...
else...
if(input1=="hot"){
    if(input2=="latte"){
        if(input3=="cl"){
            "hot caramel latte"
        }else if(input3=="ce"){
            "hot coffee latte"  
        }...
    }else if(input2=="espresso"){
          if(input3=="ao"){
              "americano"
          }else if(input3=="ma"){
              "macchiato"   
          }...
    }...
}else{
    if(input2=="latte"){
        if(input3=="cl"){
            "cold caramel latte"
        }else if(input3=="ce"){
            "cold coffee latte" 
        }...
    }else if(input2=="espresso"){
          if(input3=="ao"){
            "cold americano"
          }else if(input3=="ma"){
            "cold macchiato"    
          }...
    }...

We can refactor this by using lookup table.

var coffee_type = {
  hot:
    { 
        latte: {
            cl: "hot caramel latte",
            ce: "hot coffee latte",
            ml: "hot mocha latte"
        },
        espresso: {
            eh: "hot espresso",
            ao: "hot americano",
            ma: "hot macchiato"
        },
        non_coffee: {
            va: "hot vanilla",
            mo: "hot mocha",
            hn: "hot hazel nut"
        }
    },
  cold:
    {
        latte: {
            cl: "cold caramel latte",
            ce: "cold coffee latte",
            ml: "cold mocha latte"
        },
        espresso: {
            ao: "cold americano",
            ma: "cold macchiato"
        },
        non_coffee: {
            va: "cold vanilla",
            mo: "cold mocha",
            hn: "cold hazel nut"
        }  
    }
};

console.log(coffee_type['cold']["latte"]['ml']);
coffee_type.hot.espresso.eh

Output:

cold mocha latte
"hot espresso"