简体   繁体   中英

Javascript variable comparison

Can anyone give me some thoughts as to why number1 is being logged as 0 even though it should be logged as 1(or at least I think so)? I'm new to Javascript.

var array = [3,1,2];
var array2 = []
var number1 = 0; 
var number2 = 0;
var number3 = 0;
for(var i = 0; i < array.length; i++) {
  if(array[i] > number3) {
   number3 = array[i]

  }
  else if(array[i] > number2) {
    number2 = array[i];
  }
  else if (array[i] > number1) {
     number1 = array[i];
  }
}
console.log(number1)
console.log(number2)
console.log(number3)

In this code, the only assignment to number1 is the line that declares it, which assigns the value 0. Did you perhaps mean for this line:

array[i] = number1;

...to read:

number1 = array[i];

?

The problem is the logic of your statements and the fact that you are performing the incorrect assignment. This is what is happening

First iteration: 3 > 0 so number3 = 3 Second iteration: 1 !> 3 so we move to the second conditional where 1 > 0 so number2 = 1 third iteration: 2 !> 3 and 2 > 1 so number2 = 2 then the loop is done

Once you fix the boolean login assigning array[index] to number1 will work

I SEE YOU FIXED THE "array[i] = number1;" to be the right way. If still having trouble understanding issues i sometimes put in crude debugging using "alerts" - see bottom of my post .

Looks to me like you simply set it to 0 in line 3 (var number1 = 0; ) and never set it to anything else.

lets go loop by loop.

loop 1:

if(array[i] > number3) {
 number3 = array[i]
}

number3 = 0 on first loop and array[0] = 3, so value of array[0] will be assigned to number3, making number3 = 3

loop 2: will now skip to this else if

else if(array[i] > number2) {
 number2 = array[i];
}

number2 = 0 on second loop and array[1] = 1, so value of array[1] will be assigned to number2, making number2 = 1

loop 3: will also hit the first else if since number2 = 1 and array[i] = 2 now number2 will be assigned 2

else if(array[i] > number2) {
 number2 = array[i];
}

now your looping is done then with out hitting the last else if. so number1 still equals 0 besides that you are doing array[i] = number1; when you should do something like number1 = array[i] instead

else if (array[i] > number1) {
 array[i] = number1;
}

at least this is what it looks like it's doing to me.

Sample alerts to help debug.

<script>
var array = [3,1,2];
var array2 = []
var number1 = 0; 
var number2 = 0;
var number3 = 0;
for(var i = 0; i < array.length; i++) {

alert( 'array['+i+']='+array[i] + ', number3 ='+number3 + ',  number2 ='+number2 + ',  number1 ='+number1) 

  if(array[i] > number3) {
   number3 = array[i];
   alert (' got here A');

  }
  else if(array[i] > number2) {
    number2 = array[i];
    alert (' got here B');
  }
  else if (array[i] > number1) {
     number1 = array[i];
     alert (' got here C');
  }
}
console.log(number1)
console.log(number2)
console.log(number3)
</script>

hope that helps.

The code appears to be looking for the three highest, positive, different values in an an array of numbers. If so it suffers a logic flaw that the value overwritten in an existing highest value could be a candidate for the next highest value but does not get checked. Code that produces the kind of result apparently expected needs to perform such a check, as for example :

var array = [3,1,2];
var array2 = []
var number1 = 0; 
var number2 = 0;
var number3 = 0;
var number, temp;

for(var i = 0; i < array.length; i++) {
  number = array[i];
  if( number > number3) { // swap number with number3
    temp = number3;
    number3 = number;
    number = temp;
  }
  if( number > number2) { //swap number with number2
    temp = number2;
    number2 = number;
    number = temp;
  }
  if( number > number1) {
    number1 = number;
  }
}
console.log(number1)
console.log(number2)
console.log(number3)

If the three highest but not necessarily different values need to be found, change the > tests to >= versions.

您已设置array [i] = number1,因此它将保持为0。如果您设置number1 = array [i],它将被设置为2

1) Your

else if (array[i] > number1) {
     array[i] = number1;
}

never is called. If you try to debug step by step, you will see the condition is not met.

2) you have your code inverted.

array[i] = number1;

number1 value will be 1 only if array = [3, 2, 1] and not array = [3, 1, 2] .

Note that if array = [3, 1, 2] , the value of number2 is 1 in second iteration of the for loop and 3 in third iteration. So the number3 value never changes as the control never goes to the 3rd if statement.

for loop breakdown with array = [3, 1, 2]

Iteration 1:
number1 = 3
number2 = 0
number3 = 0

Iteration 2:
number1 = 3
number2 = 1
number3 = 0

Iteration 3:
number1 = 3
number2 = 2
number3 = 0

FYI:

 var array = [3, 2, 1]; // old value: [3, 1, 2] var array2 = [] var number1 = 0; var number2 = 0; var number3 = 0; for (var i = 0; i < array.length; i++) { if (array[i] > number3) { number3 = array[i]; // gets value 3 } else if (array[i] > number2) { number2 = array[i]; // gets value 1 if array = [3, 1, 2] and later value 2 } else if (array[i] > number1) { // condition never satisfied if array = [3, 1, 2] number1 = array[i]; } } console.log(number1) console.log(number2) console.log(number3) 

This loop doesn't work because a loop repeat everything inside the loop the number2 just got overitten.

Just do:

 var array = [3,1,2] var array2 = array.sort(); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM