如何设置变量满足for循环周期之外的条件?

时间:2019-07-01 10:07:46

标签: javascript jquery for-loop if-statement cycle

问题:

我创建了一个搜索表单,要求用户在输入表单中插入字符串。该字符串是城市的名称,如果它与我包含在JSON文件中的50个城市之一匹配,则将调用某些函数。 我们可能有三个条件:

1)输入表单留空------>出现错误日志。

2)输入形式不为空,并且该字符串与JSON文件中的50个字符串之一匹配------>显示一个表。

3)输入形式不为空,但字符串与JSON文件中的50个字符串都不匹配------>显示模式窗口

我的问题是如何以及在哪里编写命令:

$(‘#Modal#).show()

换句话说,只要插入的城市与JSON文件中包含的任何内容都不匹配,我应该如何以及在何处显示模式窗口?

我有一个cycle for:这里正在检查JSON文件中字符串的值;我不会在此处输入命令,否则模式将被调用49次:由于我有50个城市,因此其中一个与输入表单中插入的字符串匹配,而其他49个则不匹配。

我想我应该使用for loop周期之外的函数创建一个新变量,并设置条件:“该字符串与JSON文件中的一个字符串匹配,只有一个字符串匹配”;那么条件可能在for循环内为true(然后显示表格),而在for循环外为false(即“如果找到的城市数为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),您还有其他建议来显示模态窗口吗?

      • -E D I T E D----

我按如下所示编辑了代码段:

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)时也会显示模态...

      • -E D I T E D 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吗? 如果是这样,为什么我应该在for循环中指定check = truecheck = true是否与!check相同?换句话说,check告诉我什么?

2 个答案:

答案 0 :(得分:1)

您可以使用一个标志来告诉您是否找到了一个城市。

例如:

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();
    }
}

答案 1 :(得分:1)

想法是使用布尔变量作为标志,然后在循环外部检查值是否更改。

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();
  }
};