迭代嵌套json对象数组
Iterate through nested json object array
我必须遍历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结构,请建议一个正确的/更好的json结构。
请
由于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)
获得对象的键数组。但是如果是旧的浏览器,你需要一个shim
在该循环中,可以使用标准的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);
}
})();
Live Copy | Source
更新为ES6
var { products } =
{
"products": [
{
"name": "prod 1",
"versions": [
"ver 1",
"ver 2"
]
},
{
"name": "prod 2",
"versions": [
"ver 1",
"ver 2"
]
},
{
"name": "prod 3",
"versions": [
"ver 1",
"ver 2"
]
}
]
};
let inventory = products.reduce((accumulator, currentValue) => {
let { name, versions } = currentValue;
accumulator[name] = versions
return accumulator
}, []);
Object.entries(inventory).forEach((prod) => {
let prodName = prod[0];
let prodVers = prod[1].join(", ");
});
function z() {
for (let key in myJSONObject.abc) {
let value = myJSONObject.abc[key];
for (let i = 0; i <= value.length; i++) {
console.log(value[[i]]);
}
}
}
相关文章:
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象