JavaScript打印整个数组而不是单个元素

时间:2013-04-06 06:35:03

标签: javascript arrays

var input = document.querySelector("input");
var button = document.querySelector("button");
var inventory = ["jacket","pants","map"];
var actionsIKnow = ["north","east","west","south"];
var messages = ["A group of dangerous minions. Turn back, you do not have a sword",
  "You have gone too deep into the forest. Want to go further?",
  "A giant ruby crystal",
  "A silent lake; you see your reflection in the water",
  "Clear patch of land",
  "A sleeping dragon. Bettwe not wake it up",
  "A solitary cottage. Faint music can be heard from the inside",
  "Looks like this path leads to the cottage of the flute maker",
  "A lot of tombstones, looks like an old graveyard"
];

var userInput;
var startingPos = 4;

button.addEventListener("click",takeMeThere,false);

function takeMeThere(){
  userInput = input.value;
  userInput = userInput.toLowerCase();
  if(userInput!=null){
    validateInput();
  }
}
function validateInput(){
  for(var i=0;i<actionsIKnow.length;i++){
    if(userInput.indexOf(actionsIKnow[i]!=-1)){
      move(actionsIKnow[i]);
    }
  }
}
function move(where){
  console.log(where);
}

我正在制作基于文本的探索游戏,用户可以选择去哪里。用户想要去的地方取决于在文本字段中输入的内容。然后将此数据传递到move(where),其中我console.log(where)。它不打印北,东等,而是打印整个actionsIKnow数组。为什么?

2 个答案:

答案 0 :(得分:4)

简单的错误。变化

if(userInput.indexOf(actionsIKnow[i]!=-1)){

到此:

if (userInput.indexOf(actionsIKnow[i]) !== -1 ) {

http://jsfiddle.net/bz8k5/

编辑。根据评论中的讨论。为了能够以不同的格式验证输入,如东,向东移动,但禁止复活节,您可能还想使用更复杂的验证规则。也许使用正则表达式:

if (userInput.match(new RegExp("\\b" + actionsIKnow[i] + "\\b"))) {
    move(actionsIKnow[i]);
}

http://jsfiddle.net/bz8k5/2/

答案 1 :(得分:3)

仔细看看这行代码:

if(userInput.indexOf(actionsIKnow[i]!=-1)){

让我们添加空格以便于查看:

if( userInput.indexOf( actionsIKnow[i]!=-1 ) ) {

看到了吗?让我们把空格变成换行符并缩进:

if(
    userInput.indexOf(
        actionsIKnow[i] != -1
    )
) {

现在你看到了这个问题吗? : - )

无论如何,你在这里真正想要的只是:

if( userInput == actionsIKnow[i] ) {

或者,正如@nnnnnn建议的那样,您可以使用自己循环的.indexOf() 代替,如下所示:

function validateInput(){
    if( actionsIKnow.indexOf(userInput) >= 0  ) {
        move( userInput );
    }
}

但请注意一个问题:在IE8和早期版本的IE中,数组上的.indexOf()不可用。如果您需要支持IE8,这将无效。

所以这是我最喜欢的方法:使用对象查找而不是数组。

actionsIKnow更改为:

var actionsIKnow = { north:1, east:1, west:1, south:1 };

然后将validateInput()更改为:

function validateInput(){
    if( userInput in actionsIKnow ) {
        move( userInput );
    }
}

这适用于所有浏览器,如果actionsIKnow中有大量项目,则此对象查找将比.indexOf()快得多。对于少数项目,性能无关紧要,但我认为in运算符是最好的阅读代码。

这是一个jsperf,用于比较.indexOf()in与大量字符串之间的效果。