По сути, моя проблема в том, что моя программа принимает ввод текста, который заполнен случайными пробелами, символами табуляции и другими пробельными символами (также есть разрывы строк, но не так много).

Я успешно удалил все вкладки ...

// Parse the input box into an array
var inputArr = document.getElementById("inputBox").value.split(/[\t]/);

Теперь текст выглядит примерно так ...

"Пустое поле для скрытия групп",,,,, * Роль, Перейти к,, Свернуть раздел Сводка,,, Имя, Доу, Джон, Подробности, Клиент, John Doe Inc.

Моя проблема: у меня есть переключатель ...

switch(inputArr[i]) {

... это имеет несколько случаев ...

        case ("Name" || "Name " || " Name" || " Name "):
            if(inputArr[i - 1] == ("Summary" || "Summary " || " Summary" || " Summary ")) {
                contNameBool = true;
                break;
            }
            break;
        case ("Details" || "Details " || " Details" || " Details "):
            if(contNameBool == true) {
                contNameBool = false;
                break;
            } else if(contNameBool == false && compNameBool == true) {
                compNameBool = false;
                break;
            }
            break;
        case ("Customer" || "Customer " || " Customer" || " Customer "):
            if(inputArr[i - 1] == "Details") {
                contNameBool = false;
                compNameBool = true;
                break;
            }
            break;
        case "Address":
            if(inputArr[i - 1] == "Profile") {
                compNameBool = false;
                emailBool = true;
                break;
            }
            break;
        case ("VISA" || "MASTERCARD" || "AMERICAN" || "DISCOVER"):
            emailBool = false;
            break;
        case "Show":
            if(inputArr[i + 1] == "next" && inputArr[1 + 2] == "row") {
                accountLinesArray.length = inputArr[i - 1];
                for(j = 0; j < accountLinesArray.length; j++) {
                    accountLinesArray[j] = new account();
                }
                break;
            }
            break;
        case "Order":
            if(inputArr[i + 1] == "ID" && inputArr[i + 2] == "MRC") {
                accountsBool = true;
                break;
            }
            break;

Как вы, вероятно, можете сказать, я пытаюсь заставить мою программу идентифицировать определенные ключевые слова в тексте и соответственно переключать некоторые логические значения. Оператор switch, кажется, никогда не входит ни в один из случаев, независимо от того, как я настраиваю условия. Например, дело ...

case ("Name" && "Name " && " Name" && " Name "):

Не срабатывает, даже если я использую ||.

Прежде, чем кто-либо отправит это. Я понимаю, что мой код в лучшем случае небрежный. Любая помощь будет принята с благодарностью.

0
Mrow 3 Фев 2013 в 01:47

2 ответа

Лучший ответ

Во-первых, вы разделяете только вкладки. Чтобы разбить на любую последовательность пробельных символов, сделайте это:

var inputArr = document.getElementById("inputBox").value.split(/\s+/);

Это уменьшит количество дел, которые вам нужно обработать, поэтому вам не нужно проверять «Имя», «Имя», «Имя» или «Имя», просто «Имя»:

case "Name":
    ...
    break;

Во-вторых, это не так, как вы ожидаете (см. Объяснение ниже):

inputArr[i - 1] == ("Summary" || "Summary " || " Summary" || " Summary ")

Но с первым изменением выше, вы все равно можете сравнить с «Сводкой».

В-третьих, для случаев, когда вы хотите сопоставить абсолютно разные значения, вы можете сделать это:

case "VISA":
case "MASTERCARD":
case "AMERICAN":
case "DISCOVER":
    emailBool = false;
    break;

Наконец, вы действительно должны переосмыслить весь свой подход, но без каких-либо подробностей трудно дать вам какой-либо значимый совет по этому поводу ...

Удачи!

РЕДАКТИРОВАТЬ (почему inputArr[i - 1] == ("Summary" || "Summary " || ... не работает):

В Javascript ненулевые строки считаются истинными, и || и && могут использоваться как оценки короткого замыкания. Например, ("Name" || " Name") get оценивается как "Name", потому что "Name" имеет значение true, поэтому остальная часть уравнения не нуждается в оценке. Аналогично, ("Name" && " Name") будет эквивалентен " Name", потому что "Name" является истинным, поэтому он переходит к следующему, " Name", который также является истинным и является концом оператора , Чтобы сделать то, что вы пытались сделать, нужно сделать что-то вроде:

(inputArr[i - 1] == "Summary") || (inputArr[i - 1] == "Summary ") || ...

Или может быть сделано более просто с помощью регулярного выражения:

!!inputArr[i - 1].match("Summary").length
// Be careful though, as this could also match something like "NotASummaryDude"
3
redbmk 2 Фев 2013 в 22:35

После применения предложений Ray вы также можете удалить пустые элементы из массива:

for (var i=inputArr.length-1; i>=0; i--){
    if (inputArr[i] == '' || !inputArr[i].match(/[^\s]/)) inputArr.splice(i,1)
}
0
גלעד ברקן 2 Фев 2013 в 22:03