【问题标题】:how to get the json values on multiple json array如何获取多个json数组上的json值
【发布时间】:2020-05-18 20:22:10
【问题描述】:

在下面的代码中,我想获得女性的价值,即我得到 1.Personal care Appliance 和 2. Jewelry... 但之后如果我选中任何复选框,则会出现错误“未捕获的类型错误:无法读取未定义的属性‘名称’”,如果我选择多个复选框,那么我应该获取所有复选框的值。

allcat.json

[ 
   { 
      "id":"47",
      "name":"Women",
      "parent":"0",
      "status":"Enabled",
      "itemcount":44,
      "siblings":[ 
         { 
            "id":"87",
            "name":"Personal Care Appliances",
            "parent":"47",
            "status":"Enabled",
            "itemcount":2,
            "siblings":[ 
               { 
                  "id":"88",
                  "name":"Hair Dryers",
                  "parent":"87",
                  "status":"Enabled",
                  "itemcount":2,
                  "siblings":[ 

                  ]
               }
            ]
         },
         { 
            "id":"127",
            "name":"Jewellary",
            "parent":"47",
            "status":"Enabled",
            "itemcount":41,
            "siblings":[ 
               { 
                  "id":"128",
                  "name":"Artificial Jewellary",
                  "parent":"127",
                  "status":"Enabled",
                  "itemcount":41,
                  "siblings":[ 

                  ]
               }
            ]
         }
      ]
   }
]

html

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>

<div class="form-group form-inline text-center">
    <label for="select_category">Select Category</label>&emsp;
    <select class="custom-select" id="select_category" style="width: 500px;" onchange="listcatcb();">
        <option selected></option>
    </select>
</div>

<div class="container" id="cats">
    <div class="form-check" id="catrbs"> </div>
    <button class="btn btn-outline-secondary" onclick="nextcats();">Click Next!</button>
</div>

<div class="container" id="selected-item"></div>

javascript

function getallcategory() {
    $.getJSON("allcat.json", function (json) {
        var link = json;
        for (var i = 0; i < link.length; i++) {
            $("#select_category").append('<option value="' + link[i].name + '">' + link[i].name + '</option> ')
        }
    })
}

function listcatcb() {
    selcat = document.getElementById("select_category").value;
    $.getJSON("allcat.json", function (json) {
        var obj = json;
        for (var i = 0; i < obj.length; i++) {
            if (obj[i].name == selcat) {
                for (var j = 0; j < obj[i].siblings.length; j++) {
                    $("#catrbs").append('<input class="form-check-input catcbs" type="checkbox" id="' + obj[i].siblings[
                        j].name + '" value="' + obj[i].siblings[j].name + '"><label class="form-check-label" for="' +
                        obj[i].siblings[j].name + '">' +
                        obj[i].siblings[j].name +
                        '</label><br/>')
                }
            }
        }
    })
}

function nextcats() {
    $.getJSON("allcat.json", function (json) {
        console.log(json); // this will show the info it in firebug console
        var obj = json;
        console.log(obj);
        var checkedValue = $('.catcbs:checked').map(function () {
            return $(this).val();
        }).get();
        var selectedItem = '';
        for (var i = 0; i < obj.length; i++) {
            if (obj[i].name == selcat) {
                for (var j = 0; j < obj[i].siblings.length; j++) {
                    if (checkedValue.indexOf(obj[i].siblings[j].name) != -1) {
                        for (var k = 0; k < obj.length; k++) {
                            selectedItem += `<p>${obj[i].siblings[j].siblings[k].name}</p>`;
                        }
                    }
                }
            }
        }
        $('#selected-item').html(selectedItem)
    });
}
getallcategory();

【问题讨论】:

  • 您好,我在本地运行您的代码,但没有收到您上面提到的任何错误。它工作正常。尝试使用['name'] 而不是.name 也许会有所帮助。
  • Hai manoj,您的控制台显示 CORS 错误,由于 chrome 安全原因,我们不应该从本地文件中获取数据。您需要从 js 文件中导出数据并添加到 html 文件中。例如将您的 json 数据作为 var jsonData = [...] 放入 .js 文件中,并将该 .js 文件添加到您的 html 文件中,例如添加 external js 文件。然后您可以在其他 js 文件中访问这些变量,例如在您的 script.js 文件中,您可以通过调用变量 jsonData 来获取 json data
  • etta.. 我也试过了,但我又遇到了同样的错误.. 我给了脚本 src 并将我的 json 数组保存为 .js 扩展名

标签: javascript jquery html json ecmascript-6


【解决方案1】:

nextcats() 函数中,您循环在obj,然后是obj[i].siblings,然后又是obj。你可能打算循环obj[i].siblings[j].siblings

// loop on obj
for (var i = 0; i < obj.length; i++) {
    if (obj[i].name == selcat) {

        // loop on obj[i].siblings
        for (var j = 0; j < obj[i].siblings.length; j++) {
            if (checkedValue.indexOf(obj[i].siblings[j].name) != -1) {

                // loop on obj[i].siblings[j].siblings
                for (var k = 0; k < obj[i].siblings[j].length; k++) {
                    selectedItem += `<p>${obj[i].siblings[j].siblings[k].name}</p>`;
                }
            }
        }
    }
}

【讨论】:

  • 您仍然收到错误消息吗?它是否说明它发生在哪一行?
  • 不,先生,我没有得到任何错误,我也没有得到输出
  • JSON 加载是否正确?如果您将console.log(json) 添加为getJSON 回调的第一条语句,您会得到正确的内容吗?
【解决方案2】:

我尝试复制相同的内容,但没有发现任何问题。我所做的唯一更改是将 json 文件作为常量变量,而不是通过文件加载它。

const json = [{
  "id": "47",
  "name": "Women",
  "parent": "0",
  "status": "Enabled",
  "itemcount": 44,
  "siblings": [{
      "id": "87",
      "name": "Personal Care Appliances",
      "parent": "47",
      "status": "Enabled",
      "itemcount": 2,
      "siblings": [{
        "id": "88",
        "name": "Hair Dryers",
        "parent": "87",
        "status": "Enabled",
        "itemcount": 2,
        "siblings": [

        ]
      }]
    },
    {
      "id": "127",
      "name": "Jewellary",
      "parent": "47",
      "status": "Enabled",
      "itemcount": 41,
      "siblings": [{
        "id": "128",
        "name": "Artificial Jewellary",
        "parent": "127",
        "status": "Enabled",
        "itemcount": 41,
        "siblings": [

        ]
      }]
    }
  ]
}]

function getallcategory() {
        var link = json;
        for (var i = 0; i < link.length; i++) {
            $("#select_category").append('<option value="' + link[i].name + '">' + link[i].name + '</option> ')
        }
}

function listcatcb() {
    selcat = document.getElementById("select_category").value;
        var obj = json;
        for (var i = 0; i < obj.length; i++) {
            if (obj[i].name == selcat) {
                for (var j = 0; j < obj[i].siblings.length; j++) {
                    $("#catrbs").append('<input class="form-check-input catcbs" type="checkbox" id="' + obj[i].siblings[
                        j].name + '" value="' + obj[i].siblings[j].name + '"><label class="form-check-label" for="' +
                        obj[i].siblings[j].name + '">' +
                        obj[i].siblings[j].name +
                        '</label><br/>')
                }
            }
        }
}

function nextcats() {
        var obj = json;
        var checkedValue = $('.catcbs:checked').map(function () {
            return $(this).val();
        }).get();
        var selectedItem = '';
        for (var i = 0; i < obj.length; i++) {
            if (obj[i].name == selcat) {
                for (var j = 0; j < obj[i].siblings.length; j++) {
                    if (checkedValue.indexOf(obj[i].siblings[j].name) != -1) {
                        for (var k = 0; k < obj.length; k++) {
                            selectedItem += `<p>${obj[i].siblings[j].siblings[k].name}</p>`;
                        }
                    }
                }
            }
        }
        $('#selected-item').html(selectedItem)
}
getallcategory();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>

<div class="form-group form-inline text-center">
    <label for="select_category">Select Category</label>&emsp;
    <select class="custom-select" id="select_category" style="width: 500px;" onchange="listcatcb();">
        <option selected></option>
    </select>
</div>

<div class="container" id="cats">
    <div class="form-check" id="catrbs"> </div>
    <button class="btn btn-outline-secondary" onclick="nextcats();">Click Next!</button>
</div>

<div class="container" id="selected-item"></div>

【讨论】:

  • 先生,但是那个 json 数组文件不是我从 allcat.json 检索的变量
  • 您不需要像那样加载到文件中。您可以简单地使用 ES6 的 import 语句并将文件分配给一个变量。我给你看的只是一个例子。 import JSON from './&lt;your-file-path&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
相关资源
最近更新 更多