【问题标题】:Nested structure of JSON objects/arrays : HTML select listJSON对象/数组的嵌套结构:HTML选择列表
【发布时间】:2019-11-10 18:39:33
【问题描述】:

我在 JSON 对象/数组的结构方面遇到困难,我需要将其显示在我页面上的选择列表中。

{ 
    "DOMAINORIGIN": {
        "CIDR.DOMAIN.NAME": [
             "10.255.255.255",
             "172.31.255.255"
        ],
        "NIC.DOMAIN.NAME": [
             "192.168.255.255",
             "192.168.255.255",
             "255.255.255.128"

        ]
    }
}

$.ajax({
      type: 'GET',
      url: "/smisc/api/DOMAINORIGIN.log",
      dataType: "json",
      async: true
}).done(function(data) {
  var json = JSON.stringify(data.DOMAINORIGIN); 
  alert(json);
});

我需要从上面的 json 对象中解析数据。并将我的选择列表中的数据显示为

<select name="iplist" id="iplist">
CIDR.DOMAIN.NAME   //optgroup
    10.255.255.255
    172.31.255.255
NIC.DOMAIN.NAME   // optgroup
    192.168.255.255
    192.168.255.255
    255.255.255.128

optgroup 名称中的标识符,即 "CIDR" , "NIC" 每次调用 ajax url 时都会发生变化,但 ".DOMAIN.NAME" 保持不变。 不知道如何将此 JSON 数据放入选择框中。请指导如何操作?

更新:(感谢 Rk003)

var listArray = Object.keys(data["DOMAINORIGIN"]);
//alert(listArray);
var cidr_array = data.DOMAINORIGIN[listArray[0]];
var nic_array = data.DOMAINORIGIN[listArray[1]];

$("body").append('<select name="iplist" id="iplist"></select>');
$.each(data.DOMAINORIGIN, function (key,val){
    $("#iplist").append("<optgroup label='"+key+"'></optgroup>");
});
$.each(cidr_array, function(index,val){
    $("optgroup").eq(0).append("<option value='"+val+"'>"+val+"</option>");
});
$.each(nic_array, function(index,val){
    $("optgroup").eq(1).append("<option value='"+val+"'>"+val+"</option>");
});

【问题讨论】:

  • 你能再清楚一点吗? CIDR.DOMAIN.NAME 是选择选项之一吗?只是选择上方的标签?
  • CIDR.DOMAIN.NAME 是选择选项上方的标签,同样是 NIC.DOMAIN.NAME 或许多如果我进入我的 JSON
  • 您的问题并不清楚。如果您确实输入了您期望的文字 html 输出,那就很清楚了。

标签: javascript ajax


【解决方案1】:
var data = { 
    "DOMAINORIGIN": {
        "CIDR.DOMAIN.NAME": [
             "10.255.255.255",
             "172.31.255.255"
        ],
        "NIC.DOMAIN.NAME": [
             "192.168.255.255",
             "192.168.255.255",
             "255.255.255.128"

        ]
    }
};

var createDropdown = function(data) {
    var selectElement = document.getElementById('iplist');
    selectElement.innerHTML = '';

    Object.keys(data["DOMAINORIGIN"]).forEach(key => {
        var optGroupElement = document.createElement('optgroup');
        optGroupElement.setAttribute('label', key);

        data["DOMAINORIGIN"][key].forEach(ip => {
            var optionElement = document.createElement('option');
            optionElement.setAttribute('value', ip);
            optionElement.innerHTML = ip;
            optGroupElement.appendChild(optionElement);
        });

        selectElement.appendChild(optGroupElement);
    });
};

在你调用JSON.stringify(data);的地方调用函数createDropdown(data);

【讨论】:

  • 谢谢 Nikhil,这是我需要的,但我怎么能把它放到我的... }).done(function(data) { ... 我的 HTML 看起来像
【解决方案2】:

难以理解,但最适合动态生成的 JSON:

var data = { 
    "DOMAINORIGIN": {
        "CIDR.DOMAIN.NAME": [
             "10.255.255.255",
             "172.31.255.255"
        ],
        "NIC.DOMAIN.NAME": [
             "192.168.255.255",
             "192.168.255.255",
             "255.255.255.128"

        ],
        "SOME DATA": [
             "192.168...",
             "192.168...",
             "255.255..."

        ]
    }
}
$.each(data, function (key,val){
    $("body").append("<select></select>");
    let count=0;
    $.each(val, function (key2,val2){
        $("select").append("<optgroup label='"+key2+"'></optgroup>");
        $.each(val2, function (index,val3){
            $("optgroup").eq(count).append("<option value='"+val3+"'>"+val3+"</option>");
        });
    count++;
    });
});
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 感谢 Rk003。我不想要两个下拉列表,而是在一个下拉列表中我想要“CIDR.DOMAIN.NAME”和“NIC.DOMAIN.NAME”作为标签(optgroup)及其相应的值。
  • 感谢 Rk003 抽出宝贵时间!看起来很棒,可以根据需要工作。但是 optgroup 名称中的标识符,即 "CIDR" , "NIC" 不是固定的,它可以是任何值,例如 "AISC" , "QWERTY" 但 ".DOMAIN.NAME" 在键值中保持不变。所以 var cidr_array = data.DOMAINORIGIN["CIDR.DOMAIN.NAME"] 我需要让这个数组更通用来处理和制作标签并相应地附加值。很抱歉很痛苦!
  • 查看我的问题中的更新,我设法为两个带有索引的键做到了这一点。您有任何进一步的想法。
猜你喜欢
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2021-11-12
  • 2017-02-02
  • 2019-08-11
  • 1970-01-01
相关资源
最近更新 更多