Неравенство для строки и переменной Javascript - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь проверить, содержит ли массив, называемый ruleFolderNames, строку, используя метод .includes() Javascript. Строка, которую я проверяю: "Centers For Medicare & Medicaid Services".

ruleFolderNames.includes("Centers For Medicare & Medicaid Services"); // true 

Однако я не печатаю строку напрямую, я использую переменную (называемую department). Я обнаружил, что переменная department не равна первому элементу в массиве Centers For Medicare & Medicaid Services, , даже если они кажутся одинаковыми .

Вот console.log заявления:

    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 этого файла.

1 Ответ

0 голосов
/ 31 октября 2018

Поскольку сами данные для отладки отсутствуют, мы не можем точно сказать, в чем разница. Вот несколько вещей, которые нужно искать:

  1. Проверьте длину обеих строк, чтобы увидеть, может ли быть разница в начальных или конечных пробелах, которая неочевидна в консоли. Вы также можете вывести в консоль кавычки, окружающие ее, чтобы точно увидеть, что может быть в начале или в конце, например console.log(`'${department}'`) и ruleFolderNames.forEach(item => console.log(`'${item}'`)).

  2. Символы пробела могут отличаться, но выглядят как обычные пробелы в консоли. Если вы подозреваете, что разница заключается в переменной отдела (которая, по-видимому, и есть), вы можете нормализовать пробел с помощью department.replace(/\s/g, " "), который преобразует все пробельные символы регулярного выражения в один пробел.

  3. Может быть какой-то символ, который выглядит аналогично, но на самом деле это другой код символа.

Поскольку вы говорите, что department == "Centers For Medicare & Medicaid Services" ложно, я бы предложил следующий отладочный код (с вашей переменной department, переданной testStr():

function testStr(testVal, targetStr) {
        console.log("-------------");
        if (testVal === targetStr) {
            console.log("two strings are the same");
            return;
        } 
        if (testVal.length !== targetStr.length) {
            console.log("two strings are different length");
            if (testVal.trim() === targetStr) {
                console.log("Found it: testVal.trim() === targetStr");
                return;
            } else {
                console.log("testVal.trim() !== targetStr, trimming whitespace off ends is not enough");
            }
            testVal = testVal.trim();
        }
        if (testVal.replace(/\s/g, " ") === targetStr) {
            console.log("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.log("testVal = ", testVal.split("").map(item => item.charCodeAt(0)).join(","));
        console.log("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");
    }
...