该函数cheapItem(menu)应该返回数组中最昂贵的食物,即进餐。在这种情况下,它应返回“奶酪双季盛汤”。而是返回“ Double Cheeseburger”。我的代码在哪里出错?



var item1 = {
  name: "Big Mac",
  price: 3.99,
  calories: 530
};
var item2 = {
  name: "Filet-O-Fish",
  price: 3.79,
  calories: 390
};
var item3 = {
  name: "Double Cheeseburger",
  price: 1.59,
  calories: 430
};
var item4 = {
  name: "Double Quarter Pounder with Cheese",
  price: 4.79,
  calories: 740
};
var item5 = {
  name: "Chicken McNuggets",
  price: 4.49,
  calories: 190
};

var meals = [item1, item2, item3, item4, item5];


function init() {
  var lowestCost = document.getElementById('cheapestItem');

  lowestCost.onclick = function() {
    cheapestItem(meals);
  }

  var highestCost = document.getElementById('highestCost');

  highestCost.onclick = function() {
    expensiveItem(meals);
  }

}

window.onload = init;


// return name of cheapest item on menu
function cheapestItem(menu) {
  var msg = document.getElementById('msg1'); // is this necessary? Code works fine without it...

  var cheapestItem = operation(menu, "less");
  msg1.innerHTML = "The cheapest item is " + cheapestItem;
}

// return name of most expensive item on menu
function expensiveItem(menu) {
  var msg = document.getElementById('msg2');

  var expensiveItem = operation(menu, "greater");
  msg2.innerHTML = "The most expensive item is " + expensiveItem;
}

//return result based on given comparator operator
function operation(menu, op) {
  var v1 = menu[0].price;
  var item;

  for (var i = 0; i < menu.length; i++) {
    var v2 = menu[i].price;


    if ((op == "less" && (v2 < v1)) ||
      (op == "greater" && (v2 > v1))) {
      result = v2;
      item = menu[i].name;
    }
  }
  console.log(item);
  return item;
}

<body>

  <input type="button" id="cheapestItem" value="Cheapest Item">
  </div>
  <p id="msg1">message 1</p>

  <input type="button" id="highestCost" value="Most Expensive Item">
  </div>
  <p id="msg2">message 2</p>
</body>

最佳答案

问题在这里:

if ((op == "less" && (v2 < v1)) || (op == "greater" && (v2 > v1)))


您仅在比较v1v2,但是如果满足条件,还应该分配v1v2值。

说明:

以下是循环中的值

3.99 3.99
3.99 3.79
3.99 1.59
3.99 4.79
4.79 4.49




如果您注意到,则最后2个操作满足条件。因此,您将获得后者。



var item1 = {
  name: "Big Mac",
  price: 3.99,
  calories: 530
};
var item2 = {
  name: "Filet-O-Fish",
  price: 3.79,
  calories: 390
};
var item3 = {
  name: "Double Cheeseburger",
  price: 1.59,
  calories: 430
};
var item4 = {
  name: "Double Quarter Pounder with Cheese",
  price: 4.79,
  calories: 740
};
var item5 = {
  name: "Chicken McNuggets",
  price: 4.49,
  calories: 190
};

var meals = [item1, item2, item3, item4, item5];


function init() {
  var lowestCost = document.getElementById('cheapestItem');

  lowestCost.onclick = function() {
    cheapestItem(meals);
  }

  var highestCost = document.getElementById('highestCost');

  highestCost.onclick = function() {
    expensiveItem(meals);
  }

}

window.onload = init;


// return name of cheapest item on menu
function cheapestItem(menu) {
  var msg = document.getElementById('msg1'); // is this necessary? Code works fine without it...

  var cheapestItem = operation(menu, "less");
  msg1.innerHTML = "The cheapest item is " + cheapestItem;
}

// return name of most expensive item on menu
function expensiveItem(menu) {
  var msg = document.getElementById('msg2');

  var expensiveItem = operation(menu, "greater");
  msg2.innerHTML = "The most expensive item is " + expensiveItem;
}

//return result based on given comparator operator
function operation(menu, op) {
  var v1 = menu[0].price;
  var item;

  for (var i = 0; i < menu.length; i++) {
    var v2 = menu[i].price;

    if ((op == "less" && (v2 <= v1)) ||
      (op == "greater" && (v2 >= v1))) {
      result = v1 = v2;
      item = menu[i].name;
    }
  }
  console.log(item);
  return item;
}

<body>

  <input type="button" id="cheapestItem" value="Cheapest Item">
  </div>
  <p id="msg1">message 1</p>

  <input type="button" id="highestCost" value="Most Expensive Item">
  </div>
  <p id="msg2">message 2</p>
</body>





替代方式

init中对数组进行排序。现在,您不必循环即可获取最小值和最大值。

注意:使用window.load = function是一种不好的做法,应改用window.addEventListener('load', function)



var item1 = {
  name: "Big Mac",
  price: 3.99,
  calories: 530
};
var item2 = {
  name: "Filet-O-Fish",
  price: 3.79,
  calories: 390
};
var item3 = {
  name: "Double Cheeseburger",
  price: 1.59,
  calories: 430
};
var item4 = {
  name: "Double Quarter Pounder with Cheese",
  price: 4.79,
  calories: 740
};
var item5 = {
  name: "Chicken McNuggets",
  price: 4.49,
  calories: 190
};

var meals = [item1, item2, item3, item4, item5];
var OP_LESS = "less";
var OP_GREATER = "greater";

function init() {
  var lowestCost = document.getElementById('cheapestItem');

  lowestCost.onclick = function() {
    cheapestItem(meals);
  }

  var highestCost = document.getElementById('highestCost');

  highestCost.onclick = function() {
    expensiveItem(meals);
  }
  sortData();
}

function sortData(){
  meals.sort(function(a,b){
    return a.price > b.price ? 1 : a.price < b.price ? -1 : 0
  });
}

window.addEventListener('load', init);

// return name of cheapest item on menu
function cheapestItem(menu) {
  var msg = document.getElementById('msg1'); // is this necessary? Code works fine without it...

  var cheapestItem = operation(menu, OP_LESS);
  msg1.innerHTML = "The cheapest item is " + cheapestItem;
}

// return name of most expensive item on menu
function expensiveItem(menu) {
  var msg = document.getElementById('msg2');
  var expensiveItem = operation(menu, OP_GREATER);
  msg2.innerHTML = "The most expensive item is " + expensiveItem;
}

//return result based on given comparator operator
function operation(menu, op) {
  return (op === OP_LESS ? meals[0] : meals[meals.length-1]).name
}

<body>

  <input type="button" id="cheapestItem" value="Cheapest Item">
  </div>
  <p id="msg1">message 1</p>

  <input type="button" id="highestCost" value="Most Expensive Item">
  </div>
  <p id="msg2">message 2</p>
</body>

关于javascript - 比较函数的返回值不正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39972743/

10-09 18:22
查看更多