2013-03-07 73 views
7

Tôi phải lặp qua đối tượng mảng json.Lặp lại qua mảng đối tượng json lồng nhau

Nó có cấu trúc sau.

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"}, 
     ] 
    } 
}; 

Về cơ bản những gì tôi đang làm là prod_1 là tên của sản phẩm và danh sách các phiên bản prod_1 đã được điền bên trong.

Vì vậy, bây giờ những gì tôi muốn là tên của sản phẩm cũng như những phiên bản của nó.

Vấn đề là có thể có nhiều sản phẩm và nhiều phiên bản theo sản phẩm đó. Vì vậy, tôi cần cấu trúc vòng lặp thích hợp trong javascript có thể là chung để xử lý nó. Nó là tốt nhất nếu vòng lặp lưu trữ tên sản phẩm trong một var và phiên bản của nó trong một var khác vì có một số kiểm tra tôi cần phải trên tên sản phẩm.

Nếu cấu trúc json sai hoặc cấu trúc json tốt hơn có thể được viết, vui lòng đề xuất cấu trúc đúng/tốt hơn.

Hãy TRỢ GIÚP

Cảm ơn trước.

+0

Đó không phải là JSON, đó là một đối tượng initializer Javascript

Trả lời

14

myJSONObject.abc chứa danh sách các sản phẩm sẽ có ý nghĩa hơn khi xác định thuộc tính abc làm mảng. Như thế này:

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"}, 
     ] 
    ] 
}; 

Sau đó, bạn có thể duyệt qua các sản phẩm và các phiên bản của họ sử dụng các vòng lặp thông thường:

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

Bạn có thể mang nó hơi xa hơn và làm thay đổi cấu trúc đối tượng JSON của bạn một chút để làm cho nó dễ dàng hơn có thể hiểu được.

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]; 
    } 
} 
+0

** Thanx ** giải pháp với đối tượng mục có vẻ là tốt hơn. – Saurabh

+0

Câu trả lời hay! Cảm ơn bạn. Làm thế nào tôi có thể làm điều này nếu tôi không biết tên chính (ví dụ: "sản phẩm" "tên" hoặc "phiên bản")? – iSofia

+0

Tôi khuyên bạn nên tạo một câu hỏi mới và chia sẻ một ví dụ về dữ liệu của bạn để bạn có thể được trợ giúp tốt hơn. – Korijn

6

myJSONObject.abc là đối tượng có các phím như prod_1, prod_2, v.v. Bạn có thể lặp qua các phím của đối tượng bằng cách sử dụng for-in. Vì vậy:

var productName; 
var productVersionArray; 

for (productName in myJSONObject.abc) { 
    productVersionArray = myJSONObject.abc[productName]; 
} 

Lưu ý rằng thứ tự của khóa không được xác định bởi đặc điểm kỹ thuật và sẽ thay đổi từ công cụ JavaScript sang công cụ JavaScript. Nếu bạn muốn thực hiện chúng theo một thứ tự cụ thể, bạn phải lấy một mảng, sắp xếp nó theo thứ tự bạn muốn, và sau đó lặp qua mảng đó. (Trong môi trường kích hoạt ES5, bạn có thể nhận được một mảng các khóa của một đối tượng từ Object.keys(yourObject). Nhưng bạn cần có một shim cho các trình duyệt cũ hơn.)

Trong vòng lặp đó, bạn có thể lặp qua mảng bằng cách sử dụng tiêu chuẩn for loop:

for (versionIndex = 0; versionIndex < productVersionArray.length; ++versionIndex) { 
    // Use `productVersionArray[versionIndex].prod_ver` here 
} 

Dưới đây là một ví dụ đặt nó tất cả cùng nhau:

(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

Các vấn đề liên quan