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

时间:2016-09-08 01:55:57

标签: javascript jquery json each var

我遇到了一个问题,我需要根据URL是否有ID-1或ID-2等来抓取并存储JSON文件中的所有三个“house”和“exposure”..我有它们一个.each循环,它正确地遍历.JSON侦听URL中传递的正确参数。 所以举个例子。 http://localhost/?houseblock=ID-1现在只会在ID-1中加载JSON。但我需要取出并存储以供以后使用所有三个“房屋”和“曝光”数字。

我对如何正确地做到这一点有点不熟悉,我想告诉.each在一个循环后停下来抓住“房子”和“曝光”然后在第二个循环再次为二级“房子做“和”曝光“。但事实似乎并非如此。

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

1 个答案:

答案 0 :(得分:1)

不完全确定这是否是您正在寻找的内容,但以下代码段会将所有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;
});