Я пытаюсь проверить, содержит ли массив с именем ruleFolderNames
строку, используя метод Javascript .includes()
. Проверяемая строка - "Centers For Medicare & Medicaid Services"
.
ruleFolderNames.includes("Centers For Medicare & Medicaid Services"); // true
Однако я не набираю строку напрямую, я использую переменную (называемую department
). Я обнаружил, что переменная department
нет равна первому элементу в массиве, Centers For Medicare & Medicaid Services
, хотя они кажутся одинаковыми.
Вот утверждения console.info
:
ruleFolderNames[0]; // Centers For Medicare & Medicaid Services
typeof ruleFolderNames[0]; // string
department; // Centers For Medicare & Medicaid Services
typeof department; // string
Но на самом деле переменная department
не равна искомой строке.
department == "Centers For Medicare & Medicaid Services" // OUTPUTS FALSE!!!
Я включил ссылку на свой полный Github хранилище, если это полезно, ошибка содержится в строке 36 файла это.
Поскольку у нас нет фактических данных для отладки, мы не можем точно сказать, в чем разница. Вот несколько вещей, на которые стоит обратить внимание:
Проверьте длину обеих строк, чтобы увидеть, может ли быть разница в начальных или конечных пробелах, которая не очевидна в консоли. Вы также можете вывести на консоль в кавычках, чтобы точно увидеть, что может быть в начале или в конце, например console.info(`'${department}'`)
и ruleFolderNames.forEach(item => console.info(`'${item}'`))
.
Символы пробелов могут быть разными, но в консоли выглядят как обычные пробелы. Если вы подозреваете, что разница заключается в переменной отдела (которая, по-видимому, и есть), вы можете нормализовать пробелы с помощью department.replace(/\s/g, " ")
, который преобразует все символы пробелов регулярных выражений в один пробел.
Может быть какой-то символ, который выглядит похожим, но на самом деле это другой код символа.
Поскольку вы говорите, что department == "Centers For Medicare & Medicaid Services"
является ложным, я бы предложил следующий код отладки (с вашей переменной department
, переданной в testStr()
:
function testStr(testVal, targetStr) {
console.info("-------------");
if (testVal === targetStr) {
console.info("two strings are the same");
return;
}
if (testVal.length !== targetStr.length) {
console.info("two strings are different length");
if (testVal.trim() === targetStr) {
console.info("Found it: testVal.trim() === targetStr");
return;
} else {
console.info("testVal.trim() !== targetStr, trimming whitespace off ends is not enough");
}
testVal = testVal.trim();
}
if (testVal.replace(/\s/g, " ") === targetStr) {
console.info("replacing whitespace makes a match")
return;
}
// still no match, so lets output each separate character as a char code
// to manually see what's different
console.info("testVal = ", testVal.split("").map(item => item.charCodeAt(0)).join(","));
console.info("targetStr = ", targetStr.split("").map(item => item.charCodeAt(0)).join(","));
}
const testValues = [
" Centers For Medicare & Medicaid Services", // leading whitespace
"Centers For Medicare & Medicaid Services ", // trailing whitespace
"Centers\tFor Medicare & Medicaid Services", // tab for whitespace
"C℮nters For Medicare & Medicaid Services", // odd first e in Centers
"Cënters For Medicare & Medicaid Services" // odd first e in Centers
];
for (let t of testValues) {
testStr(t, "Centers For Medicare & Medicaid Services");
}
Спасибо. В переменной был конечный пробел, который я не видел.
В самом вопросе недостаточно информации, чтобы ответить, но я бы начал с проверки
.length
каждой строки, и если это не сработает, сравните charCodes каждой строки.for (const letter of department) console.info(letter.charCodeAt(0));
Найдите первый, который не соответствует (или используйте петлюfor
и сделайте что-нибудь, когдаdepartment[i] !== ruleFolderNames[0][i]
)