开发者问题收集

JavaScript - 在用户生成的数组中查找对象

2017-02-23
63

我正在编写的脚本应该相当简单。用户会看到两个按钮。一个按钮用于将自己的输入输入到数组中。创建此数组后,它会自动排序。第二个按钮允许用户搜索数组中可能存在或不存在的任何数字。这就是我的问题开始的地方。

应该发生的是,当用户输入他们想要查找的数字时。在数组中搜索该数字。如果该数字存在于该数组中,则会出现一条消息,提示已找到该数字。如果未找到该数字,则会出现一条消息,说明已找到该数字。

我觉得问题出在我的搜索函数中的 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>
3个回答

更新 :有两个问题:一是 arr 未在您的函数中定义。另一个是您的 numSearch for 循环后面直接有一个分号,导致它提前终止并且永远不会迭代您的结果。另外,我建议将字符串解析为数字并使用严格相等,如本例所示。

此外,您可以通过从冒泡排序切换到合并排序,将算法的效率从 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>
cchamberlain
2017-02-23

这是因为 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) {
  // ...
}
ibrahim mahrir
2017-02-23

有两个问题。

第一个问题是,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>
ToMakPo
2017-02-23