Reputation: 79
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
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
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