2015-10-20 24 views
-1

我正在用Javascript寫一個函數。基本上,如果數組的第一個元素中的字符串包含數組第二個元素中的所有字母,它應該返回true。我輸入["hello","hey"]如果我在函數中返回兩次,第二個覆蓋第一個函數嗎?

function mutation(arr) { 
     var string1 = arr[0].toLowerCase(); 
     var array=[]; 
     for (i=0;i<=string1.length-1;i++) { 
     array[i]=string1[i]; 
     } 

     var string2 = arr[1].toLowerCase(); 

     var result = true; 

     label: 
     for(i=0;i<string2.length;i++) { 
     if (array.indexOf(string2[i]) == -1) { 
      result = false; 
      break label; 
     } 
     else { 
      result = true; 
     } 
     } 

     return result; 

    } 

這會給我正確的結果false測試我的功能。但是,如果我以不同的方式編寫我的循環,那麼它會給我true

label: 
    for(i=0;i<string2.length;i++) { 
    if (array.indexOf(string2[i]) == -1) { 
     return false; 
     break label; 
    } 
    else { 
     return true; 
    } 
    } 

我在第二種方法中做錯了什麼地方?

+3

*「在哪裏我做錯了我的第二個方法是什麼?」 *只要你'從函數return',它終止。如果控制已經傳回給調用者,該循環如何能夠繼續運行? –

+0

在循環的第一次迭代中,您檢查'array.indexOf('h')== -1',因爲'「你好」'含有''h''',所以'false'。因爲條件是'false',所以'else'分支在函數返回true的地方執行。同樣,'return' **終止**函數。 –

+0

@JK感謝您的意見:) – 3x89g2

回答

-1

在您的第一種情況下,邏輯已退出並返回值false,只要它符合條件(array.indexOf(string2[i]) == -1)在您的情況下。

在第二種情況下,數組的第一個元素不滿足條件並落入else條件,因此退回true返回。在這一點上

+0

這種分析不正確。現在我會暫時拒絕投票。問題不在於返回false,而是返回true。 – Nelson

1

你的第二個方法突破:

return true

發生在正匹配返回的那一刻,你的FOR循環終止。

在您的初始版本中,因爲它只設置result = true,所以FOR循環繼續,直到它遇到FALSE,然後您的顯式BREAK發生。

但是,在其他版本中,if語句將遇到RETURN FALSERETURN TRUE,它將僅迭代一次,返回結果並結束FOR循環。

2

A return語句立即終止函數。在第二次執行時,儘早返回false的確是正確的,但return true語句錯誤 - 它會返回true,而第一個元素不包含在第二個數組中。實際上,您正在否定循環 - 只檢查第一個元素,並立即返回值。

你打算在這裏什麼是早期只返回false值:

for (i = 0; i < string2.length; i++) { 
    if (array.indexOf(string2[i]) == -1) { 
     return false; 
    } 
} 
// If we finished the loop and haven't returned false, the return value is true: 
return true; 
+0

我在時間上擊敗了你,但你完整地擊敗了我。你的更好:) – Nelson

相關問題