Array.include () всегда false, Array.indexOf () всегда -1 и Array.find () всегда неопределен при обратном вызове маршрутизатора Express - PullRequest
0 голосов
/ 20 марта 2019

Я использовал fs.readFile() и fs.readFileSync(), чтобы прочитать 'words_alpha.txt'. Файл общедоступен по адресу: https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt

Даже если запрос test соответствует слову в массиве строк файла words_alpha.txt, JSON всегда отвечает { includes: false, indexFound: false, found: undefined, forFound: false } следующим кодом JavaScript:

var express = require('express');
var router = express.Router();
var fs = require('fs');

router.get('/test_validation', function(req, res, next) {
  const { test } = req.query;

  fs.readFile('words_alpha.txt', function(err, data) {
    const words = data.toString().split('\n');

    const includes = words.includes(test);
    const indexFound = words.indexOf(test) > -1;
    const found = words.find(word => word === test);

    let forFound = false;
    for (i in words) {
      if (words[i] === test) {
        forFound = true;
        break;
      }
    }

    res.json({ includes, indexFound, found, forFound });
  });
});

Почему words.includes(test), words.indexOf(test) и words.find(word => word === test) не смогли найти совпадений и даже с for (i in words) if (words[i] === test)? Но 'words_alpha.txt' words может быть зарегистрирован один за другим с помощью for (i in words) console.log(words[i]), но для его завершения потребуется несколько секунд.

1 Ответ

2 голосов
/ 20 марта 2019

Проблема в том, что используемый вами файл имеет окончания строк в стиле Windows (CR LF или \r\n, выраженные в символах), и вы разбиваетесь на окончания строк в стиле Unix (LF или \n), что приводит к неверному массиву слов :

const stringOfWords = "apple\r\nbroccoli\r\ncarrot"; //windows line endings
console.log(stringOfWords)

const words = stringOfWords.split("\n");
console.log(words);

console.log(words.includes("apple"))

Или вы можете разделить только окончания строк Windows, но вы рискуете, что код не работает для окончаний строк Unix:

const stringOfWords = "apple\r\nbroccoli\r\ncarrot"; //windows line endings
console.log(stringOfWords)

const words = stringOfWords.split("\r\n");
console.log(words);

console.log(words.includes("apple"))

Или вместо этого вы можете преобразовать ваш файл в окончания файлов Unix, и ваш код будет работать без изменений:

const stringOfWords = "apple\nbroccoli\ncarrot"; //unix line endings
console.log(stringOfWords)

const words = stringOfWords.split("\n");
console.log(words);

console.log(words.includes("apple"))

Или вы можете обрезать свои слова, чтобы удалить пробелы и, таким образом, иметь возможность обрабатывать оба конца строки, но это может быть потенциально тяжелой операцией для больших файлов:

const stringOfWords = "apple\r\nbroccoli\r\ncarrot"; //windows line endings
console.log(stringOfWords)

const words = stringOfWords.split("\n")
  .map(word => word.trim());
console.log(words);

console.log(words.includes("apple"))

Или вы также можете разделить регулярным выражением для концов строк Windows или Unix:

const stringOfWords = "apple\r\nbroccoli\r\ncarrot"; //windows line endings
console.log(stringOfWords)

const words = stringOfWords.split(/\r?\n/);
console.log(words);

console.log(words.includes("apple"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...