从 .getJson 多个 .each 循环中存储多个对象

Store multiple Objects from .getJson multiple .each loop

我 运行 遇到了一个问题,我需要根据 URL 有 ID-1 或​​ ID-2 等。我将它们放在一个 .each 循环中,它正确地遍历 .JSON 监听在 URL 中传递的正确参数。 例如。 http://localhost/?houseblock=ID-1 现在只会加载 ID-1 内的 JSON。但是我需要获取并存储所有三个 "house" 和 "exposure" 数字以备后用。

我不太熟悉如何正确执行此操作,我想告诉 .each 在一个循环后停止以获取 "house" 和 "exposure",然后在第二个循环中执行此操作再次为次要 "house" 和 "exposure"。但事实似乎并非如此。

JSON jsonFile.json

{
   "ID-1":{
      "1-1":{
         "house":6,
         "exposure":1
      },
      "1-2":{
         "house":1,
         "exposure":3
      },
      "1-3":{
         "house":3,
         "exposure":2
      }
   },
   "ID-2":{
      "2-1":{
         "house":3,
         "exposure":2
      },
      "2-2":{
         "house":6,
         "exposure":5
      },
      "2-3":{
         "house":1,
         "exposure":1
      }
   }
}

JQUERY

$(document).ready(function()
{
    // -- Listen to URL Changes --//
    var urlListen;
    (window.onpopstate = function()
    {
        var match,
            pl = /\+/g, // Regex for replacing addition symbol with a space
            search = /([^&=]+)=?([^&]*)/g,
            decode = function(s)
            {
                return decodeURIComponent(s.replace(pl, "-"));
            },
            query = window.location.search.substring(1);
        urlListen = {};
        while (match = search.exec(query)) urlListen[decode(match[1])] = decode(match[2]);
    })();
    var retrieveAll = $.getJSON('jsonFile.json', function(data) {}).done(function(data)
    {
        $(data[urlListen["houseblock"]]).each(function(i, val)
        {
            $.each(val, function(j, b)
            {
                $.each(b, function(k, v)
                {
                    console.log(k + " : " + v);
                    if (k == "house")
                    {
                        houseObj = v;
                        houseObj2 = v;
                        houseObj3 = v;
                    }
                });
            });
        });
    }).fail(function(data)
    {
        console.log("error");
    }).always(function(data)
    {
        console.log("complete");
    });
    retrieveAll.complete(function(data)
    {
        init();
    });
});

function init()
{
    console.log(houseObj);
    console.log(houseObj2);
    console.log(houseObj3);
}

不完全确定这是否是您要查找的内容,但以下代码段将所有 houseexposure 值存储到它们自己的数组中。你不需要使用 $.each;使用 Javascript 的原生 map.

更简单

根据你发布的代码,我假设你可以将你的逻辑组件抽象成一个函数getCurrentHouseBlockID(或类似的东西)。

var id = getCurrentHouseBlockID();  // 'ID-1'
var dataForID = Object.keys(jsonData[id]);  // ['1-1', '1-2', '1-3']
var houseNums = dataForID.map(function getHouseNum(key) {
    return dataForID[key].house;
});
var exposureNums = dataForID.map(function getExposureNum(key) {
    return dataForID[key].exposure;
});