使用函数优化代码?

时间:2018-02-14 20:11:15

标签: javascript function

我想知道如何优化我的代码以减少整体线条。

我有以下内容:

for (var i = 0; i < meals; i++){
for (var x = 0; x < veggies.length; x++)
{
  rdm = Math.floor(Math.random()*veggies.length);
  var veggie = veggies[rdm]['name'];
  var veggieCal = vegPortion * veggies[rdm]["calories"];
  var veggieGrams = Math.floor((veggieCal * veggies[rdm]["weight"])/meals);
  console.log(veggieGrams);
}

for (var x = 0; x < carbs.length; x++)
{
  rdm = Math.floor(Math.random()*carbs.length);
  var carb = carbs[rdm]['name'];
  var carbCal = carbPortion * carbs[rdm]["calories"];
  var carbGrams = Math.floor((carbCal * carbs[rdm]["weight"])/meals);
  console.log(carbGrams);
}

for (var x = 0; x < proteins.length; x++)
{
  rdm = Math.floor(Math.random()*proteins.length);
  var protein = proteins[rdm]['name'];
  var protCal = protPortion * proteins[rdm]["calories"];
  var protGrams = Math.floor((protCal * proteins[rdm]["weight"])/meals);
  console.log(protGrams);
}

var ListItem = document.createElement("li");
var text= document.createTextNode(carbGrams+"g of "+carb+", "+veggieGrams+"g of "+veggie+" and "+protGrams+"g of "+protein);
ListItem.appendChild(text);
insdiv3.appendChild(ListItem);

}

正如我们所看到的,我的3块积木基本相同。我想编写一个函数,它提供与我相同的语法,我使用5个参数,我将在调用函数时替换它:

  function rdmMeal(a,b,c,d,f)  {
for (var x = 0; x < a.length; x++)
{
  rdm = Math.floor(Math.random()*a.length);
  var b = a[rdm]['name'];
  var c = d * a[rdm]["calories"];
  var f = Math.floor((c * a[rdm]["weight"])/meals);
}
}

然后我可以调用该函数并添加我的参数:

//THIS IS WHAT I WANT MY CODE TO LOOK LIKE
for (var i = 0; i < meals; i++){
rdmMeal(veggies,veggie,veggieCal,vegPortion,veggieGrams);
rdmMeal(proteins,protein,protCal,protPortion,protGrams);
rdmMeal(carbs,carb,carbCal,carbPortion,carbGrams);}

因此参数被我的变量替换,实质上是优化代码,我该怎么做呢?我写的是正确的语法,还是我想采用不同的方式?

1 个答案:

答案 0 :(得分:0)

将这些东西放在循环中是没有意义的,它们总是分配给相同的变量。充其量,那些符合if (….length > 0)语句的资格,我们应该假设那些不是必需的。

接下来,请注意变量名称绝对没有意义。您可以将它们命名为任何名称,只要对其范围中的变量的每个引用都使用相同的名称即可。您也无法将变量名称作为参数传递,您只能传递值。因此,应从您的函数中删除参数bcf。相反,使用通用名称,可以指蔬菜或蛋白质或碳水化合物或任何东西的卡路里,一些用于克和物品名称。

由于无法分配动态可选择的外部作用域变量,因此您需要使用函数的返回值。你基本上需要克和名字。由于您无法返回两个值,因此需要在函数内部将它们组合在一起。你可以将它们放在一个返回的对象中,但是因为你只是将它们放在那个字符串中,你可以立即这样做。

所以你的功能应该是这样的:

function rdmMeal(categoryItems, portion)  {
  var rdm = Math.floor(Math.random() * categoryItems.length);
  var name = categoryItems[rdm].name;
  var calories = portion * categoryItems[rdm].calories;
  var grams = Math.floor((calories * categoryItems[rdm].weight)/meals);
  return grams+"g of "+name;
}

你可以这样使用它:

for (var i = 0; i < meals; i++) {
  var veggie = rdmMeal(veggies, vegPortion);
  var carb = rdmMeal(carbs, carbPortion);
  var protein = rdmMeal(proteins, protPortion);

  var listItem = document.createElement("li");
  var text = document.createTextNode(carb+", "+veggie+" and "+protein);
  listItem.appendChild(text);
  insdiv3.appendChild(listItem);
}