Quang nGUYEN
Quang nGUYEN

Reputation: 79

Javascript Comparison Weird

I got into the problem with the comparison. The result supposes to be 11 as the cost of products at index 11 is less than the cost of the product at index 18. But somehow the result is 18

    var scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18,
    41, 53, 55, 61, 51, 44];
    var costs = [.25, .27, .25, .25, .25, .25, .33, .31, .25, .29, .27, .22, .31, .25, .25, .33, .21, .25, .25, .25, .28, .25, .24, .22, .20, .25, .30, .25, .24, .25,
        .25, .25, .27, .25, .26, .29];
//TOTAL, HIGHEST, INDEX OF THE HIGHEST
function index(array,arrayCost){
    var maximum=Math.max(...array);
    var arrayIndex=[];
    for(var i=0;i<array.length;i++){
        if(array[i]==maximum){
            arrayIndex.push(i)
        }
    }

   var minimum=arrayCost[arrayIndex[0]];//0.22
   for(var i=0;i<arrayIndex.length;i++){
       if(arrayCost[arrayIndex[i]]<=minimum){//0.25>=0.22
           minimum=arrayIndex[i];
       }
   }
    return minimum;
}

Upvotes: 1

Views: 95

Answers (2)

user12407908
user12407908

Reputation:

Your bug is shown in the comments, but I'd rework it to use a single loop:

var scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18,
    41, 53, 55, 61, 51, 44];
    var costs = [.25, .27, .25, .25, .25, .25, .33, .31, .25, .29, .27, .22, .31, .25, .25, .33, .21, .25, .25, .25, .28, .25, .24, .22, .20, .25, .30, .25, .24, .25,
        .25, .25, .27, .25, .26, .29];


function index(array, arrayCost) {
  var maxScore = Math.max(...array);
  var minCostIndex = null;
  for (var i = 0; i < arrayCost.length; i++) {
    if (array[i] != maxScore) {
      continue;
    }
    if (minCostIndex == null || arrayCost[i] < arrayCost[minCostIndex]) {
      minCostIndex = i;
    }
  }

  return minCostIndex;
}

console.log("res", index(scores, costs));


You could even eliminate the Math.max if you wanted:

var scores = [60, 50, 60, 58, 54, 54, 58, 50, 52, 54, 48, 69, 34, 55, 51, 52, 44, 51, 69, 64, 66, 55, 52, 61, 46, 31, 57, 52, 44, 18,
    41, 53, 55, 61, 51, 44];
    var costs = [.25, .27, .25, .25, .25, .25, .33, .31, .25, .29, .27, .22, .31, .25, .25, .33, .21, .25, .25, .25, .28, .25, .24, .22, .20, .25, .30, .25, .24, .25,
        .25, .25, .27, .25, .26, .29];


function index(array, arrayCost) {
  var maxScore = array[0];
  var minCostIndex = 0;
  
  // start iteration at 1, since 0 is accounted for in the vars
  for (var i = 1; i < arrayCost.length; i++) {
    if (array[i] > maxScore) {
      maxScore = array[i];
      minCostIndex = i;
      continue
    }

    if (array[i] == maxScore && arrayCost[i] < arrayCost[minCostIndex]) {
      minCostIndex = i;
    }
  }

  return minCostIndex;
}

console.log("res", index(scores, costs));

Upvotes: 1

Daniel Pantalena
Daniel Pantalena

Reputation: 429

In your second if, you reassign minimum with arrayIndex[i] that values is 11, so at the next loop minimum will be 11 and arrayCost[arrayIndex[i]] will be less than 11. You can create another variable that stores the index value.

function index(array, arrayCost) {
  var maximum = Math.max(...array);
  var arrayIndex = [];
  for (var i = 0; i < array.length; i++) {
    if (array[i] == maximum) {
      arrayIndex.push(i);
    }
  }

  var resultIndex = arrayIndex[0];
  var minimumCost = arrayCost[arrayIndex[0]]; //0.22
  for (var i = 0; i < arrayIndex.length; i++) {
    if (arrayCost[arrayIndex[i]] <= minimumCost) {
      //0.25>=0.22
      minimumCost = arrayCost[arrayIndex[i]];
      resultIndex = arrayIndex[i];
    }
  }
  return resultIndex;
}

Upvotes: 1

Related Questions