Странное сравнение Javascript

#javascript

#javascript

Вопрос:

Я столкнулся с проблемой при сравнении. Предполагается, что результат равен 11, поскольку стоимость продуктов с индексом 11 меньше стоимости продукта с индексом 18. Но почему-то результат равен 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;
}
  

Комментарии:

1. Должно быть minimum=arrayCost[arrayIndex[i]]

2. Это не может быть arrayCost[arrayIndex[i]], потому что вам нужно присвоить значение minimum, чтобы вы могли сравнить его с другими значениями в массиве. Более того, вы еще не объявили переменную I, поэтому, скорее всего, результат не определен.

3. …. Я имел в виду ту часть, которая у вас теперь есть, так как minimum=arrayIndex[i]; должна быть изменена

4. Спасибо за ваш совет. Ошибка действительно происходит оттуда :))

Ответ №1:

Во втором if случае вы переназначаете minimum с arrayIndex[i] этими значениями 11 , поэтому в следующем цикле минимум будет 11 и arrayCost[arrayIndex[i]] будет меньше 11 . Вы можете создать другую переменную, которая хранит index значение.

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

  

Ответ №2:

Ваша ошибка показана в комментариях, но я бы переработал ее, чтобы использовать один цикл:

 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));  


Вы могли бы даже исключить Math.max , если бы захотели:

 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 amp;amp; arrayCost[i] < arrayCost[minCostIndex]) {
      minCostIndex = i;
    }
  }

  return minCostIndex;
}

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