2017-01-23 129 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) 

如果三個最高,但不需要被發現必然是不同的值,則>測試改爲>=版本。