在下拉列表中使用 Jquery 解析 JSON

Posted

技术标签:

【中文标题】在下拉列表中使用 Jquery 解析 JSON【英文标题】:Parsing JSON using Jquery in dropdowns 【发布时间】:2019-06-20 06:41:13 【问题描述】:

我正在使用下拉菜单构建一个特定的位置选择器。我需要3个下拉菜单。 现在我得到了 json 并尝试相应地解析它,但我遇到了一些问题。这是我正在使用的 json 的一小部分。


"Chandigarh": 
    "CHANDIGARH": ["Sector 21 (Chandigarh)", "Sector 22 (Chandigarh)", "Sector 23 ( Chandigarh)", "Sector 26 (Chandigarh)", "Sector 29 (Chandigarh)", "Sector 30"]
 "Andhra Pradesh": 
    "EAST GODAVARI": ["D Vemavaram", "Gangavaram", "GSL Medical College", "Konthamuru", "Navara", "Satellite City"]
      "CHITTOOR": ["Appa Rao Street", "Madanapalle Spinning Mills Gds", "Akkurthi", "Chiyyavaram", "Chodavaram", "Gottipudi", "Kasaram", "Muchivolu", "Obulayapalle"]

所以我试图将州解析为一个下拉列表,并且可以选择基于州的子区域,并且可以选择基于子区域的城市名称。 例如。如果我在一个下拉列表中选择“Andhra Pradesh”,其他必须显示“East Godavri”和“chittoor”,无论我选择哪个,都必须在第三个下拉列表中显示它的城市。 到目前为止,我已经尝试过使用 jquery getjson

$.getJSON(url, function(data) 
console.log(data);
$.each(data, function(index, value) 


  $("#state").append(
    '<option value="' + index + '">' + index + "</option>"
  );
);


 );



 $("#state").change(function() 


countryCode = $("#state").val();

$.getJSON(url, function(data) 

  $('#sub').append('<option value="">Please select your region</option>');
  $.each(data.response.venue.countryCode, function(index, value) 

    $("#sub").append(
      '<option value="' + index + '">' + index + "</option>"
    );
  );
);


 );

我正在获取所有城市名称,但不是子区域,任何可以帮助我的人

【问题讨论】:

您发布的 JSON 是否准确?如果是这样,有什么办法可以改变结构,让它更有意义?我认为这可能是问题的一部分,因为您有一个大型对象,该对象具有多个具有状态名称的属性,并且这些属性具有带有子区域名称的子属性。我的观点是,除非您知道数据是什么,否则您无法了解 JSON 中的单词代表什么。对你来说,这是有道理的,但对我来说,它看起来令人困惑,这是一个问题。如果你需要一个例子,请告诉我。我只能在这里输入这么多。 【参考方案1】:

首先让我们将 JSON 数据重构为此包含一个选项 id(使用id 作为选项的值)

[
  
    id: 1,
    name: "Chandigarh",
    regions: [
      
        id: 2,
        name: "CHANDIGARH",
        areas: [
           id: 3, name: "Sector 21 (Chandigarh)" ,
           id: 4, name: "Sector 22 (Chandigarh)" ,
           id: 5, name: "Sector 23 ( Chandigarh)" ,
           id: 6, name: "Sector 26 (Chandigarh)" ,
           id: 7, name: "Sector 29 (Chandigarh)" ,
           id: 8, name: "Sector 30" 
        ]
      
    ]
  ,
  
    id: 9,
    name: "Andhra Pradesh",
    regions: [
      
        id: 10,
        name: "EAST GODAVARI",
        areas: [
           id: 11, name: "D Vemavaram" ,
           id: 12, name: "Gangavaram" ,
           id: 13, name: "GSL Medical College" ,
           id: 14, name: "Konthamuru" ,
           id: 15, name: "Navara" ,
           id: 16, name: "Satellite City" 
        ]
      ,
      
        id: 17,
        name: "CHITTOOR",
        areas: [
           id: 18, name: "Appa Rao Street" ,
           id: 19, name: "Madanapalle Spinning Mills Gds" ,
           id: 20, name: "Akkurthi" ,
           id: 21, name: "Chiyyavaram" ,
           id: 22, name: "Chodavaram" ,
           id: 23, name: "Gottipudi" ,
           id: 24, name: "Kasaram" ,
           id: 25, name: "Muchivolu" ,
           id: 26, name: "Obulayapalle" 
        ]
      
    ]
  
]

更新获取代码以将数据保存到变量中。

var states;

$.getJSON(url, function (data) 
  states = data; // Save data to variable, so no need to fetch data everytime user change the select
  $("#state").html(`<option>Select State..</option>`);
  $("#region").html(`<option>Select region..</option>`);
  $("#area").html(`<option>Select area..</option>`);
  $.each(states, function (index, state) 
    $('#state').append(`<option value="$state.id">$state.name</option>`);
  );
);

然后将事件分配给选择

$("#state").bind("change", function()  // When select state change
  let state = states.find(s => s.id == $(this).val());

  // set region options

  $("#region").html(`<option>Select region..</option>`);
  $.each(state.regions, function(index, region) 
    $("#region").append(`<option value="$region.id">$region.name</option>`);
  );

  $("#area").html(`<option>Select area..</option>`);
);

$("#region").bind("change", function()  // When select region change
  let region = states
    .map(s => s.regions)
    .flat()
    .find(r => r.id == $(this).val());

  // set area options

  $("#area").html(`<option>Select area..</option>`);
  $.each(region.areas, function(index, area) 
    $("#area").append(`<option value="$area.id">$area.name</option>`);
  );
);

这里是完整的例子

https://codesandbox.io/s/5k87rkr16p

【讨论】:

嘿,非常感谢您的帮助,而且效果很好,我只想知道除了手动逐行进行之外,还有什么方法可以重组 json。 您的数据来自哪里?数据库还是 json 文件? 我有一个很大的 json 文件。

以上是关于在下拉列表中使用 Jquery 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSON 数据填充下拉列表作为 jQuery 中的 ajax 响应

后台封装成jsonarray,前台js如何接收并存储到下拉列表中,急急急。。。

状态列表json数据进入下拉选择使用jquery

如何使用 jquery json 获取多个下拉列表

无法绑定来自 jquery 数据库中 json 值的下拉列表值

如何使用 jquery json 和 php 更改多个下拉列表