从 .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);
}
不完全确定这是否是您要查找的内容,但以下代码段将所有 house
和 exposure
值存储到它们自己的数组中。你不需要使用 $.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;
});
我 运行 遇到了一个问题,我需要根据 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);
}
不完全确定这是否是您要查找的内容,但以下代码段将所有 house
和 exposure
值存储到它们自己的数组中。你不需要使用 $.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;
});