Почему мой массив не определен? (ванильный JavaScript) - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь сделать простой фильтр «плохих слов» с помощью JavaScript. Он предназначен для прослушивания любых событий отправки на странице, затем итерации по всем полям ввода текстового типа, проверки их на наличие ошибок, сравнения введенного текста со списком слов и, наконец, возврата соответствующего console.log / alert (дляв настоящее время).

У меня есть два файла: word-list.js с критическими словами (сначала загружается) и filter.js, который извлекает массив со всеми словами из word-list.js.

Мои проблемы: swear_words_arr[1] это 'undefined' и я не понимаю почему. Я искал решения, но все же не могу определить причину этого. Помощь очень ценится.

// get all inputs type = text and turn html collection into array
var getInputs = document.querySelectorAll("input[type=text]")
var inputs = Array.from(getInputs);

//var swear_alert_arr -> from in word-list.js
var swear_alert_arr = new Array();
var swear_alert_count = 0;

function reset_alert_count() {
  swear_alert_count = 0;
}

function validate_text() {
  reset_alert_count();

  inputs.forEach(function(input) {

    var compare_text = input.value;

    console.log(compare_text);

      for (var i = 0; i < swear_words_arr.length; i++) {
        for (var j = 0; j < compare_text.length; i++) {
          if (
            swear_words_arr[i] ==
            compare_text.substring(j, j + swear_words_arr[i].length).toLowerCase()
          ) {
            swear_alert_arr[swear_alert_count] =
              compare_text.substring(
                j,
                j + swear_words_arr[i].length
              );
            swear_alert_count++;
          }
        }
      }
      var alert_text = "";

      for (var k = 1; k <= swear_alert_count; k++) {
        alert_text += "\n" + "(" + k + ")  " + swear_alert_arr[k - 1];

        if (swear_alert_count > 0) {
          alert("No!");
          console.log('omg no bad stuff! D:');
        } else {
          console.log('no bad stuff found :)');
        }
      }
    });
}

window.onload = reset_alert_count;
window.addEventListener('submit', function() {
    validate_text();
});

1 Ответ

0 голосов
/ 17 октября 2019

Не похоже, что вы объявили массив, к которому пытаетесь получить доступ.

Но вместо циклов с вложенными циклами и отслеживания счетчиков циклов просто получите новый массив, который содержит все плохие слова в представленном массиве. Вы можете сделать это несколькими способами, но метод Array.prototype.filter () прекрасно работает:

let badWords = ["worse", "terrible", "horrible", "bad"];
let submittedWords = ["Good", "Terrible", "Great", "Fabulous", "Bad", "OK"];

// Loop over the submitted words and return an array of all the bad words found within it
let bad = submittedWords.filter(function(word){
  // Do a case-insensitive match test. Return the word from the submitted words
  // if it's on the bad word list.
  return badWords.indexOf(word.toLowerCase()) > -1 ? word: null;
});

console.log("Bad words found in submitted data: " + bad.join(", "));
...