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