2017-02-23 62 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, но как только функция была запущена, она будет уничтожена.

Вторая проблема заключалась в том, что между запятой и кронштейном имеется точка с запятой ;{.

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