Как установить переменную для выполнения условия вне цикла for? - PullRequest
0 голосов
/ 01 июля 2019

проблема:

Я создал поисковую форму, где пользователю предлагается вставить строку в форму ввода.Строка - это название города, и, если оно совпадает с одним из 50 городов, которые я включил в файл JSON, вызывается некоторая функция.У нас может быть три условия:

1) Форма ввода оставлена ​​пустой ------> появляется журнал ошибок.

2) Форма ввода не пуста, и строка соответствуетодна из 50 строк в файле JSON ------> отображается таблица.

3) Форма ввода не пуста, но строка не соответствует ни одной из 50 строк в JSONфайл ------> отображается модальное окно

Моя проблема в том, как и где написать команду:

$(‘#Modal#).show()

Другими словами, как и где я должен показатьмодальное окно всякий раз, когда вставленный город не совпадает ни с одним из включенных в мой файл JSON?

У меня есть cycle for: здесь проверяются значения строк в файле JSON;Я бы не стал вводить команду туда, иначе модал будет вызываться 49 раз: так как у меня 50 городов, один из них соответствует строке, вставленной в форму ввода, а другой 49 - нет.

Полагаю, мне следует создать новую переменную с функцией вне цикла for loop, установив условие: «строка соответствует одной и только одной из строк в файле JSON»;тогда условие может быть истинным внутри цикла for (а затем я отображаю таблицу), тогда как оно ложно вне цикла for (т. е. «если число найденных городов равно 0», а затем я показываю модальное окно).

Код, который я написал до сих пор, следующий:

function validateCitta() {
  let text = $('#inlineFormInputCitta').val();
  if (text === "") {
    $("#errorLog").show();
  } else {
    $("#errorLog").hide();
    $.ajax({
      url: "https://nominatim.openstreetmap.org/search?q=" + encodeURIComponent($("#inlineFormInputCity").val()) + "&format=geocodejson",
      dataType: "json",
      success: function(data) {
        for (let i = 0; i < data.features.length; i++) {
          let typeCity = data.features[i].properties.geocoding.type;
          if (typeCity === "city") {
            let nameCity = data.features[i].properties.geocoding.name;
            for (let i = 0; i < json.tappe.length; i++) {
              let tappa = json.tappe[i];
              let city = json.tappe[i].city;
              if (city === nameCity) {
                console.log("JSON file has been activated");
                $("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
                $("#tabella").show();
              };
            };
          }
        }
      }
    })
  }
};

Как я могу установить новую переменную для выполнения третьего 3) условия выше?ИЛИ АЛЬТЕРНАТИВНО, не могли бы вы предложить другое модальное окно, если выполняется условие (3)?

      • -EDITED - - - -

Я отредактировал фрагмент, как показано ниже:

function validateCitta() {    

    let text = $('#inlineFormInputCitta').val(); 
    var check = false;    
    if (text === "") {    
        $("#errorLog").show();    
    } else {    
        $("#errorLog").hide(); 
        $.ajax({
            url: "https://nominatim.openstreetmap.org/search?q=" + encodeURIComponent($("#inlineFormInputCitta").val()) + "&format=geocodejson",
            dataType: "json",
            success: function (data) {    
                for (let i = 0; i < data.features.length; i++) {
                    let typeCity = data.features[i].properties.geocoding.type;    
                    if (typeCity === "city") {    
                        let nameCity = data.features[i].properties.geocoding.name;        
                        for (let i = 0; i < json.tappe.length; i++) {    
                            let tappa = json.tappe[i];    
                            let city = json.tappe[i].city;    
                            if (city === nameCity) {    
                                var check = true;  
                                $("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");    
                                $("#tabella").show(); 
                            }
                            ;
                        }
                        ;   
                    }
                }
            }
        })
        if (check) {
            $('#myModal').show();
        }
    }
};

Но это не работает.С другой стороны, если я напишу

if (!check) {
                $('#myModal').show();  

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

      • -EDITED 2 - - - -

Я написал следующий код. Это работает, но Я не совсем понимаю роль логического флага check и как его значение изменяется внутри и снаружи цикла for:

function validateCitta() {        
    let text = $('#inlineFormInputCitta').val();

    if (text === "") {            
        $("#errorLog").show();
    }   //condition 1: no strings, no problem

    else {                      
        $.ajax({
            url: "https://nominatim.openstreetmap.org/search?q=" + encodeURIComponent($("#inlineFormInputCitta").val()) + "&format=geocodejson",
            dataType: "json",
            success: function (data) {

                var check = false;     //I set the flag variable outside the cycle

                for (let i = 0; i < data.features.length; i++) {
                    let typeCity = data.features[i].properties.geocoding.type;
                    if (typeCity === "city") {
                        let nameCity = data.features[i].properties.geocoding.name;
                        for (let i = 0; i < json.tappe.length; i++) {
                            let tappa = json.tappe[i];
                            let city = json.tappe[i].city;
                            if (city === nameCity) {

                                check = true;    
               //conditon 3 is fullfilled: strings matches


                                $("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
                                $("#tabella").show();                                    
                            }
                                ;
                        }
                            ;
                    }
                }    
                if (!check) {   //does !check means that the value of 'check' is opposite to the one set at the beginning?
                    $('#myModal').show();                    }
            }
        })            
    }    
};

Имеет var check = false означает, что все написано после того, как оно (цикл for в данном случае) ложно?

Значит ли !check означает, что var check = false не соответствует действительности, то есть check === true?Если так, почему я должен указывать check = true внутри цикла for?Разве check = true не совпадает с !check?Другими словами, что check говорит мне?

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Идея состоит в том, чтобы использовать логическую переменную в качестве флага, а затем вне цикла проверить, изменилось ли значение.

function validateCitta() {
  let text = $('#inlineFormInputCitta').val();
  let check = false;

  if (text === "") {
    $("#errorLog").show();
  } else {
    $("#errorLog").hide();
    $.ajax({
      url: "https://nominatim.openstreetmap.org/search?q=" + encodeURIComponent($("#inlineFormInputCity").val()) + "&format=geocodejson",
      dataType: "json",
      success: function(data) {
        for (let i = 0; i < data.features.length; i++) {
          let typeCity = data.features[i].properties.geocoding.type;
          if (typeCity === "city") {
            let nameCity = data.features[i].properties.geocoding.name;
            for (let i = 0; i < json.tappe.length; i++) {
              let tappa = json.tappe[i];
              let city = json.tappe[i].city;
              if (city === nameCity) {
                check = true;
              };
            };
          }
        }
      }
    })
  }
  //check if you need to display the modal

  if (check)
  {
  console.log("JSON file has been activated");
  $("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
  $("#tabella").show();
  }
};
1 голос
/ 01 июля 2019

Вы можете использовать флаг, который сообщает, был ли найден город.

Например:

if (typeCity === "city") {
    let nameCity = data.features[i].properties.geocoding.name;
    let IsCityFound = false; // <------------------------------- not found by default
    for (let i = 0; i < json.tappe.length; i++) {
        let tappa = json.tappe[i];
        let city = json.tappe[i].city;
        if (city === nameCity) {
            IsCityFound = true; // <---------------------------- Now found
            console.log("JSON file has been activated");
            $("#tbody").append("<tr><td>" + tappa.name + "</td><td>" + tappa.state + "</td><td>" + tappa.region + "</td><td>" + tappa.city + "</td></tr>");
            $("#tabella").show();
        }
    }
    if (!IsCityFound) { // <------------------------------------ Was it NOT found ?
        $('#Modal').show();
    }
}
...