[英]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循環結構,它可以是通用的來處理它。
如果循環將產品名稱存儲在一個 var 中並將其版本存儲在另一個 var 中,那將是最好的,因為我需要對產品名稱進行一些檢查。
如果 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)
獲取對象鍵的數組。但是對於舊瀏覽器,您需要一個墊片。)
在該循環中,您可以使用標准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);
}
})();
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]]);
}
}
}
用 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(", ");
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.