2017-02-23 48 views
1

我正在處理的腳本應該相當簡單。用戶呈現兩個按鈕。一個將自己的輸入輸入到數組中。一旦這個數組被創建,它就會自動排序。第二個按鈕允許用戶搜索可能存在或不存在於數組中的任何數字。這是我的問題開始的地方。JavaScript - 在用戶生成的數組中查找對象

應該發生的事情是,當用戶輸入他們想要找到的號碼。該數組將搜索該號碼。如果該數字存在於該數組中,則會顯示一條消息,指出已找到該數字。如果沒有找到該號碼,則會顯示一條消息。

我覺得問題在於我的搜索功能中的for循環。不幸的是,我還沒有自己找到解決方案。當我在代碼片段提交中運行代碼時,出現以下錯誤。

 {"message": "Uncaught TypeError: Cannot read property 'length' of undefined", 
     "filename": "http://stacksnippets.net/js", 
     "lineno": 65, 
     "colno": 16 } 

該腳本的最新版本已被插入以供參考。任何幫助表示感謝,並提前感謝。

/* Array Function */ 
 

 
function arrayFunction() { 
 
    var arr = []; 
 
    for (var i = 0; i < 5; i++) 
 
    arr.push(prompt("Enter a number")); 
 

 

 
    bubbleSort(arr); 
 
    console.log(arr); 
 

 
    arr.toString(); 
 
    window.confirm("Your sorted array is: " + arr).innerHTML = arr; 
 
} 
 

 
/* Sort Function */ 
 

 
function bubbleSort(arr) { 
 
    var swapped; 
 
    do { 
 
    swapped = false; 
 
    for (var i = 0; i < arr.length - 1; i++) { 
 
     if (arr[i] > arr[i + 1]) { 
 
     var temp = arr[i]; 
 
     arr[i] = arr[i + 1]; 
 
     arr[i + 1] = temp; 
 
     swapped = true; 
 
     } 
 
    } 
 
    } while (swapped); 
 
} 
 

 
/* Search Function */ 
 

 

 
function numSearch(arr) { 
 
    var x = window.prompt("Search for a number."); 
 
    for (var i = 0; i < arr.length; i++); { 
 
    if (arr[i] == x) { 
 
     return window.confirm("It's here."); 
 
    } 
 
    } 
 
    return window.confirm("It is not here.") 
 
}
<html> 
 

 
<head> 
 
</head> 
 

 
<body> 
 

 
    <script language="JavaScript"> 
 
    </script> 
 

 
    <button type="button" onclick="arrayFunction()">Create Array</button> 
 
    <button type="button" onclick="numSearch()">Search Array</button> 
 

 
</body> 
 

 
</html>

回答

1

UPDATE:這裏有兩個問題:一個是arr沒有在你的函數定義。另一個原因是你的分號直接跟在你的numSearchfor循環之後,導致它提前終止並且從不迭代你的結果。另外,我建議將字符串解析爲數字,並使用嚴格的等式,如本例所示。

另外,通過從冒泡排序切換到合併排序,您可以將算法的效率從O(N^2)降低到O(N log N)

下面的代碼片段工作:

/* Array Function */ 
 
let arr = []; 
 
function arrayFunction() { 
 
    arr = []; 
 
    for (let i = 0; i < 5; i++) { 
 
    arr.push(parseInt(prompt("Enter a number"))); 
 
    } 
 

 
    bubbleSort(); 
 
    console.log(arr); 
 

 
    arr.toString(); 
 
    window.confirm("Your sorted array is: " + arr).innerHTML = arr; 
 
} 
 

 
/* Sort Function */ 
 
function bubbleSort() { 
 
    var swapped; 
 
    do { 
 
    swapped = false; 
 
    for (let i = 0; i < arr.length - 1; i++) { 
 
     if (arr[i] > arr[i + 1]) { 
 
     var temp = arr[i]; 
 
     arr[i] = arr[i + 1]; 
 
     arr[i + 1] = temp; 
 
     swapped = true; 
 
     } 
 
    } 
 
    } while (swapped); 
 
} 
 

 
/* Search Function */ 
 
function numSearch() { 
 
    var x = parseInt(window.prompt("Search for a number.")); 
 
    for (let i = 0; i < arr.length; i++) { 
 
    if (arr[i] === x) { 
 
     return window.confirm("It's here."); 
 
    } 
 
    } 
 
    return window.confirm("It is not here.") 
 
}
<html> 
 
<head></head> 
 
<body> 
 
    <button type="button" onclick="arrayFunction()">Create Array</button> 
 
    <button type="button" onclick="numSearch()">Search Array</button> 
 
</body> 
 
</html>

+1

非常感謝你。 – lostintranslation

0

這是因爲arr的功能arrayFunction因此,只有在其範圍內訪問內部定義。如果您想要在其他功能(如numSearch)中訪問它,則必須將其設置爲全局。將其聲明爲參數並在不使用參數的情況下調用該函數不會解決問題。試試這個結構:

var arr = []; // arr is gloabal now it can be accessed by all other functions bellow it 

function arrayFunction() { 
    //var arr = []; // remove this line 
    // ... 
} 

function bubbleSort(arr) { 
    // ... 
} 

function numSearch(arr) { 
    // ... 
} 
0

有2個問題。

第一個是arr被創建,但只要函數完成運行,它就會被銷燬。

第二個問題是,在for和括號{之間有分號;

/* Array Function */ 
 

 
var main_array = []; // <-------------------------------------add this. 
 

 
function arrayFunction() { 
 
    var arr = []; 
 
    for (var i = 0; i < 5; i++) 
 
    arr.push(prompt("Enter a number")); 
 

 

 
    bubbleSort(arr); 
 
    console.log(arr); 
 

 
    arr.toString(); 
 
    window.confirm("Your sorted array is: " + arr).innerHTML = arr; 
 
    
 
    main_array = arr; // <-------------------------------------add this. 
 
} 
 

 
/* Sort Function */ 
 

 
function bubbleSort(arr) { 
 
    var swapped; 
 
    do { 
 
    swapped = false; 
 
    for (var i = 0; i < arr.length - 1; i++) { 
 
     if (arr[i] > arr[i + 1]) { 
 
     var temp = arr[i]; 
 
     arr[i] = arr[i + 1]; 
 
     arr[i + 1] = temp; 
 
     swapped = true; 
 
     } 
 
    } 
 
    } while (swapped); 
 
} 
 

 
/* Search Function */ 
 

 

 
function numSearch() { // <------------------------------------remove `arr` 
 
    var x = window.prompt("Search for a number."); 
 
    var arr = main_array; // <-----------------------------------add this. 
 
    for (var i = 0; i < arr.length; i++) { // <------------------remove semicolon. 
 
    if (arr[i] == x) { 
 
     return window.confirm("It's here."); 
 
    } 
 
    } 
 
    return window.confirm("It is not here.") 
 
}
<html> 
 

 
<head> 
 
</head> 
 

 
<body> 
 

 
    <script language="JavaScript"> 
 
    </script> 
 

 
    <button type="button" onclick="arrayFunction()">Create Array</button> 
 
    <button type="button" onclick="numSearch()">Search Array</button> 
 

 
</body> 
 

 
</html>