在JavaScript对象中进行线性搜索

时间:2016-01-02 02:28:07

标签: javascript html

我正在尝试创建一堆JS对象并将它们全部放入一个数组中,以便能够线性搜索每个对象中包含的值。

我很确定在搜索传入的值时嵌套的for循环会出现问题。我正在调查.contains()方法,只使用简单的比较运算符==和===而且没有他们一直在为我工作。所以我的问题是当我输入我的文本框'times square'时,暂时我只想弹出警告框并在其POI数组中显示包含该目的地的对象的名称。

我的HTML下面只是一个简单的文本框和一个提交按钮。有什么帮助吗?

// scripts

var bmtBroadWayLine = {
      color: 'yellow',
      poi: ["times square", 'south ferry'],
      letters: 'N Q R',
      name: "BMT Broadway Line",
};

var destinations = [];
destinations[1] = bmtBroadWayLine;

function findDestination() {
      for (var i = 0; i < destinations.length; i++) {
            for (var j = 0; j < destinations[i].poi.length; j++) {
                  if (destinations[i].poi[j] == document.getElementById("dest-entry")) {
                        alert(destinations[i].poi[j].name);
                  }
            }
      }
}
<!DOCTYPE html>
<html>
      <head>
            <meta charset="utf-8">
            <title>Routes</title>
      </head>
      <body>

            <h1>Where Do You Want To Go?</h1>

            <input type="text" id="dest-entry">
            <input type="button" value="Send" onclick="findDestination()">

            <div id="output"></div>

            <script src="scripts.js"></script>
      </body>
</html>

1 个答案:

答案 0 :(得分:6)

这个脚本有很多问题:

  • 您正在将字符串与DOM对象进行比较
  • 您正试图访问字符串的name属性
  • 您在基于零的索引语言中使用基于1的索引

不是错误,但仍然是:

  • 您未验证为空
  • 你在每次迭代时查找一个DOM项目,这很慢。

您正在将字符串与DOM对象进行比较。

if (destinations[i].poi[j] == document.getElementById("dest-entry")) {
    alert(destinations[i].poi[j].name);
}

相反,将它与DOM对象中的字符串值进行比较:

if (destinations[i].poi[j] == document.getElementById("dest-entry").value) {
    alert(destinations[i].poi[j].name);
}

可能还想检查此NULL

document.getElementById("dest-entry")

此外,您正在访问name

string媒体资源
alert(destinations[i].poi[j].name);
你可能只想要这个:

alert(destinations[i].name);

此外:

destinations[1] = bmtBroadWayLine;

简单地做

destinations.push(bmtBroadWayLine);

当你添加一个索引不是第一个可用的项时,长度增加超过1.所以现在你有1个元素,长度是2,然后第一个元素是未定义的,你和& #39;重新尝试访问undefined的属性。