2017-09-26 1 views
0

Je ne parviens pas à retourner une déclaration quand mon RegExp trouve aucune correspondance:si empêchant autre boucle pour passer à travers l'objet

function ai(message) { 
    if (username.length < 3) { 
     username = message; 
     send_message("Oh, well hello " + username + ", My name is Donald J Trump and i'm a big boy"); 
    } else { 
     for (i = 0; i <= botChat.length; i++) { 
      var re = new RegExp(botChat[i][0], "i"); 
      if (re.test(message)) { 
       var length = botChat[i].length - 1; 
       var index = Math.ceil(length * Math.random()); 
       var reply = botChat[i][index]; 
       send_message(reply); 
      } 
     } 
    } 
} 

Quand j'entre une phrase peut correspondre correctement la première ligne dans un tableau selon la for boucle. Le problème que j'ai est quand j'essaie d'ajouter une déclaration else il cesse de faire une boucle sur ma matrice correctement.

J'ai essayé:

else if (re.test(message) === false) { 
    send_message("i can't be expected to know everything"); 
} 

Mais cela ne fonctionne pas, il empêche la boucle de boucle passé botChat[0][0].

J'ai aussi essayé:

if (send_message().val() == "") { 
    // ... 
} 

Mais chaque fois que mon code ne fonctionne plus. Existe-t-il une méthode pour ajouter quelque chose à mon tableau qui dit "si vous ne trouvez pas de correspondance ci-dessus, choisissez ceci"?

Ou juste une façon de travailler mon code pour que le if/else fonctionne?

joint est le codepen.

+0

Vous n'avez pas montré 'botChat' ici, mais il semble que ce code perd beaucoup de temps à compiler et recompiler des expressions régulières alors que vous devriez probablement le faire une fois par initialisation. – tadman

+0

'pour (i = 0; i <= botChat.length; i ++)' si botChat.length vous donne la longueur de la première dimension, il n'y a rien dans le bloc for qui arrête l'incrément 'i ++'. botChat n'est pas réaffecté, et la boucle var 'i' n'est pas modifiée. Quel genre de problème vous avez? Le seul endroit où vous pouvez ajouter else est if (re.test (message)) {} 'else {}' Le re est dans la portée du bloc for, donc il doit y avoir un autre problème. Vous pouvez essayer de commenter le bloc if et imprimer la boucle var 'i' à chaque passage. – sln

+0

Si j'ai bien compris, alors la solution la plus simple serait de 'return' directement après avoir appelé' send_message' afin qu'il ne continue pas à traiter la boucle. Vous pourriez alors mettre votre traitement 'else' après la fin de la boucle. Je ne comprends pas pourquoi vous appelez '.val()', il semble que vous invoquiez au hasard une méthode jQuery pour accéder à une valeur d'entrée même si 'send_message' ne retourne rien. – skirtle

Répondre

0

j'ai vérifié votre codepen et les lignes 190 et 194 console.log(send_message().val()); semble être briser la boucle parce que ces lignes lancent une exception car send_message() retours undefined et undefined n'a pas la méthode .val().

Vos expressions régulières fonctionnent correctement. Je recommande de ne pas créer de nouveaux objets RegExp à chaque itération, à la place, utilisez celui défini dans le tableau if (botChat[i][0].test(message)), le surcoût sera moindre.

+0

merci d'avoir regardé dedans. La boucle se brise même sans console.log(). J'ai remplacé la nouvelle variable et l'ai changée pour être simplement un if/else mais elle ne passe plus à travers aucun des autres objets dans le tableau, botchat, sauf pour le premier objet – BenjiKemp

+0

(i = 0; i <= botChat .length; i ++) { if (botChat [i] [0] .test (message)) { var longueur = botChat [i] .length - 1; var index = Math.ceil (longueur * Math.random()); var réponse = botChat [i] [index]; send_message (réponse); retour; } else { send_message ("je ne comprends pas"); retour; – BenjiKemp