通过嵌套的json对象数组迭代
我必须遍历json数组对象。通过嵌套的json对象数组迭代
它具有以下结构。
var myJSONObject = {
"abc": {
"prod_1": [
{"prod_ver" : "prod 1 ver 1"},
{"prod_ver" : "prod 1 ver 2"},
],
"prod_2": [
{"prod_ver" : "prod 2 ver 1"},
{"prod_ver" : "prod 2 ver 2"},
],
"prod_3": [
{"prod_ver" : "prod 3 ver 1"},
{"prod_ver" : "prod 3 ver 2"},
]
}
};
基本上我正在做的是prod_1是一个产品的名称和prod_1所包含的版本列表。
所以现在我想要的是产品的名称以及它的版本。
问题是可以有许多产品和该产品下的许多版本。 所以我需要一个合适的循环结构javascript可以通用来处理它。
如果循环将产品名称存储在一个变量中,并且它的版本在另一个变量中,那么最好是因为有一些检查需要对产品名称进行检查。
如果json结构错误或者可以编写更好的json结构,请提出正确/更好的结构。
请HELP
在此先感谢。
由于myJSONObject.abc
包含产品列表,因此将数组abc
定义为数组更有意义。就像这样:
var myJSONObject =
{
"abc":
[
[
{"prod_ver" : "prod 1 ver 1"},
{"prod_ver" : "prod 1 ver 2"},
],
[
{"prod_ver" : "prod 2 ver 1"},
{"prod_ver" : "prod 2 ver 2"},
],
[
{"prod_ver" : "prod 3 ver 1"},
{"prod_ver" : "prod 3 ver 2"},
]
]
};
然后你可以遍历产品和使用正常的循环它们的版本:
for(var i = 0; i < myJSONObject.abc.length; i++)
{
var product = myJSONObject.abc[i];
for(var j = 0; j < product.length; j++)
{
var version = product[j];
}
}
你可以把它进一步小幅并改变你的JSON对象的结构有点使它更容易可以理解的。
var catalog =
{
"products": [
{
"name": "prod 1",
"versions": [
"ver 1",
"ver 2"
]
},
{
"name": "prod 2",
"versions": [
"ver 1",
"ver 2"
]
}
]
};
for(var i = 0; i < catalog.products.length; i++)
{
var product = catalog.products[i];
var productName = product.name;
for(var j = 0; j < product.versions.length; j++)
{
var version = product.versions[j];
}
}
myJSONObject.abc
是一个带有像prod_1
,prod_2
等键的对象。您可以使用for-in
循环访问对象的键。所以:
var productName;
var productVersionArray;
for (productName in myJSONObject.abc) {
productVersionArray = myJSONObject.abc[productName];
}
请注意,键的顺序不是由规范定义,并且会因JavaScript引擎而异。如果你想按特定的顺序来完成它们,你必须得到它们的一个数组,按照你想要的顺序排序,然后循环访问这个数组。 (在启用ES5的环境中,您可以从Object.keys(yourObject)
获得一个对象的键阵列,但是您需要为较老的浏览器使用垫片。)
在该循环中,您可以使用标准for
循环:
for (versionIndex = 0; versionIndex < productVersionArray.length; ++versionIndex) {
// Use `productVersionArray[versionIndex].prod_ver` here
}
这里的推杆为例一起:
(function() {
var myJSONObject =
{
"abc":
{
"prod_1":
[
{"prod_ver" : "prod 1 ver 1"},
{"prod_ver" : "prod 1 ver 2"}
],
"prod_2":
[
{"prod_ver" : "prod 2 ver 1"},
{"prod_ver" : "prod 2 ver 2"}
],
"prod_3":
[
{"prod_ver" : "prod 3 ver 1"},
{"prod_ver" : "prod 3 ver 2"}
]
}
};
var productName;
var productVersionArray;
var versionIndex;
for (productName in myJSONObject.abc) {
productVersionArray = myJSONObject.abc[productName];
display(productName + " has " + productVersionArray.length + " versions listed");
for (versionIndex = 0; versionIndex < productVersionArray.length; ++versionIndex) {
display("* " + productVersionArray[versionIndex].prod_ver);
}
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = String(msg);
document.body.appendChild(p);
}
})();