2017-01-23 135 views
0

任何人都可以给我一些想法,为什么number1被记录为0,即使它应该记录为1(或至少我认为是这样)?我是Javascript新手。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) 
+3

非常简单 - 用于'number1 ='的CTRL-F。它只分配一次 - 为0.看起来像一个基本的错误 - 我认为你有第三个错误的方式。 – Katana314

+1

我没有看到任何你重新分配或增加'number1'的地方。 – elethan

+0

number1被赋值为0,就是这样。它从来没有分配过。 –

回答

4

在这段代码中,唯一的分配number1是,声明它,它的值0分配你或许意味着这一行的行,:

array[i] = number1; 

...阅读:

number1 = array[i]; 

+1

谢谢,我试过,但仍然记录为0! – RomeP

+0

查看@TyAnthoney的评论 - 你在数组中只有3个数字,并且循环结构的方式,它会将第二个和第三个数字写入'number2'。 –

+0

我打算在这里出现一个肢体,并猜测你正在寻找阵列中最大的3个数字。如果情况并非如此,请忽略它,但到目前为止,最简单和最直观的方法是对整个数组进行排序,然后取最后3个值:array.sort(); var largest3 = array.slice(-3);' –

0

已设置阵列[I] = NUM​​BER1,所以如果设置NUMBER1它将停留为0 =阵列[I],将设定为2

0

1)你

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

从未叫做。如果您尝试逐步调试,则会看到未满足条件。

2)你有你的代码倒置。

array[i] = number1; 
1

问题是您的语句的逻辑和您执行错误赋值的事实。这是正在发生的事情

第一次迭代: 3> 0,因此number3的= 3 第二次迭代: 1> 3,所以我们移动到第二个条件,其中1> 0,数字2 = 1 第三次迭代: 2 !> 3和2> 1,从而NUMBER2 = 2,那么一旦固定布尔登录分配数组[索引]到数字1将工作

0

number1值将是循环完成

1仅当array = [3, 2, 1]不是array = [3, 1, 2]

请注意,如果array = [3, 1, 2]number2的值在for循环的第二次迭代中为1,第三次迭代中的值为3。所以number3的值永远不会改变,因为控件永远不会去第3条if语句。与array = [3, 1, 2]

for环击穿

迭代1:
NUMBER1 = 3
NUMBER2 = 0
number3的= 0

迭代2:
NUMBER1 = 3
NUMBER2 = 1
number3的= 0

迭代3:
NUMBER1 = 3个
NUMBER2 = 2
number3的= 0

供参考:

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)

0

这个循环不起作用,因为循环重复家居内循环NUMBER2刚刚overitten。

只要做到:

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

1

我明白你固定在 “阵列[I] =数字1;”是正确的方式。如果仍然无法理解问题,我有时会使用“警报”进行粗略调试 - 请参阅我的文章的底部。

在我看来就像你可以将它设置为0的3线(VAR数字1 = 0;) ,从不把它设置为别的。

让我们一起循环。

循环1:

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

number3的上第一环路和数组= 0 [0] = 3,所以阵列的值[0]将被分配到number3的,使得number3的= 3

环2: 现在将跳过此否则如果

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

NUMBER2上第二环路和阵列[1] = 1,所以阵列的值[1]将被分配到数字2 = 0,使得数字2 = 1

循环3: 也将碰到的第一个否则如果因为数字2 = 1个阵列[I] = 2 现在NUMBER2将被分配2

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

现在您的循环与出打 然后完成最后的其他如果。所以number1仍等于0 除了你在做 array [i] = number1; 时,你应该这样做 数字1 =数组[我],而不是

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

至少这是它看起来像是在对我做。

示例警报以帮助调试。

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

希望有帮助。

+0

总之,数组中的数据表示'number2'设置了两次:'1'大于'0'设置'number2','2'大于'而'1'也设置'number2'。'number1'永远不会被查看或设置。 – traktor53

1

该代码似乎是在一个数组数组中寻找三个最高的正数不同的值。如果是这样的话,它会有一个逻辑缺陷,即在现有最高值中被覆盖的值可能成为下一个最高值的候选者,但不会被检查。产生明显预期的那种结果的代码需要进行这样的检查,,例如

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) 

如果三个最高,但不需要被发现必然是不同的值,则>测试改为>=版本。