2010-02-19 24 views
10

Với những 4 biến,Tạo một Tree JSON từ một chuỗi hệ thống phân cấp

var el1 = {name:'ronaldo', team: 'europe/spain/realmadrid'} 
var el2 = {name:'messi', team: 'europe/spain/barcelona'} 
var el3 = {name:'gerald', team: 'europe/england/liverpool'} 
var el4 = {name:'unknown english', team: 'europe/england'} 

tôi cần phải tạo ra hệ thống phân cấp cây JSON này,

{ 
    "text":"europe", 
    "leaf":false, 
    "children":[ 
     { 
      "text":"spain", 
      "leaf":false, 
      "children":[ 
       { 
        "text":"realmadrid", 
        "leaf":false, 
        "children":[ 
         { 
          "text":"ronaldo", 
          "leaf":true 
         } 
        ] 
       }, 
       { 
        "text":"barcelona", 
        "leaf":false, 
        "children":[ 
         { 
          "text":"messi", 
          "leaf":true 
         } 
        ] 
       } 
      ] 
     }, 
     { 
      "text":"england", 
      "leaf":false, 
      "children":[ 
       { 
        "text":"unknown english", 
        "leaf":true 
       }, 
       { 
        "text":"liverpool", 
        "leaf":false, 
        "children":[ 
         { 
          "text":"gerald", 
          "leaf":true 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

Trả lời

12

Nó muốn được waaay dễ dàng hơn nếu bằng cách nào đó el1-EL4 được kết hợp thành một đối tượng duy nhất, như

var data = [] 
data[0] = {name:'ronaldo', team: 'europe/spain/realmadrid'} 
data[1] = {name:'messi', team: 'europe/spain/barcelona'} 
data[2] = {name:'gerald', team: 'europe/england/liverpool'} 
data[3] = {name:'unknown english', team: 'europe/england'} 

Bằng cách đó bạn có thể ít nhất lặp qua chúng một cách nhanh chóng khi xử lý.

Cũng sẽ hữu ích khi biết tại sao bạn cần phải lưu trữ nó dưới dạng cây JSON. Ý tôi là, không phải tất cả các nút đều giống nhau, phải không? Cấp độ đầu tiên là lục địa, sau đó là quốc gia, sau đó là tên nhóm và lá là cầu thủ bóng đá cá nhân. Đó là một cấu trúc dữ liệu khá khó hiểu và tôi không chắc nó sẽ hữu ích như thế nào. Dù bằng cách nào, nó có thể hữu ích hơn để dịch nó thành một cấu trúc fielded đầu tiên và sau đó tạo ra cây.

Chỉnh sửa: Được rồi, vì vậy tôi nghĩ về nó nhiều hơn một chút và tôi nghĩ có thể một cái gì đó như thế này có thể làm điều đó.

var data = []; 
data[0] = {name:'ronaldo', team: 'europe/spain/realmadrid'}; 
data[1] = {name:'messi', team: 'europe/spain/barcelona'}; 
data[2] = {name:'gerald', team: 'europe/england/liverpool'}; 
data[3] = {name:'unknown english', team: 'europe/england'}; 

var tree = {}; 
function fillTree(name,steps) { 
    current = null; 
    for (var y = 0; y < steps.length; y++) { 
     if (y==0) { 
     if (!tree.children||typeof tree.children == 'undefined'){ 
      tree = { text: steps[y], leaf: false, children: [] }; 
     } 
     current = tree.children; 
     } else { 
     current.push({ text: steps[y], leaf: false, children: [] }) 
     current = current[current.length - 1].children; 
     } 
    } 
    current.push({ text: name, leaf: true }) 
} 

for (x=0; x < data.length; x++) { 
    steps =data[x].team.split('/'); 
    fillTree(data[x].name,steps) 
} 

Điều này tạo ra đối tượng JavaScript. Tôi để nó cho bạn để chuyển đổi nó thành JSON.

Cập nhật:

Yeah, tôi thấy rằng kịch bản cũ sẽ phải luôn đặt mức kỷ lục trong ở cấp thứ hai ngay cả khi nó đã tồn tại. Đây là mới cải thiện chức năng FillTree:

var tree = {}; 
function fillTree(name,steps) { 
    var current = null, 
    existing = null, 
    i = 0; 
    for (var y = 0; y < steps.length; y++) { 
     if (y==0) { 
     if (!tree.children||typeof tree.children == 'undefined'){ 
      tree = { text: steps[y], leaf: false, children: [] }; 
     } 
     current = tree.children; 
     } else { 
     existing = null; 
     for (i=0; i < current.length; i++) { 
      if (current[i].text === steps[y]) { 
       existing = current[i]; 
       break; 
      } 
     } 
     if (existing) { 
      current = existing.children; 
     } else { 
      current.push({ text: steps[y], leaf: false, children: [] }); 
      current = current[current.length - 1].children; 
     } 
     } 
    } 
    current.push({ text: name, leaf: true }) 
} 

Cách đơn giản nhất để chuyển đổi đối tượng này thành JSON, rõ ràng, là sử dụng JSON.stringify(tree) mặc dù rõ ràng điều này là không thống nhất được hỗ trợ (see the JavaScript JSON Page).

+0

Cảm ơn Jordan, nhưng Châu Âu chỉ nên có 2 trẻ em (Tây Ban Nha và Anh) – user275031

+0

@ Cảm ơn bạn! Nếu bạn có một giải pháp tuyệt vời cho mình, xin vui lòng gửi nó. –

+1

Mã mà tôi đã viết có đầu vào được đưa ra và chính xác tạo ra kết quả mong muốn. Sự khác biệt duy nhất là nó là đầu ra như một cấu trúc JavaScript, mà OP được tự do chuyển đổi sang JSON bằng cách sử dụng bất kỳ phương thức nào họ muốn. Trong trường hợp bạn đang băn khoăn, việc chỉ trích một cách vô tình câu trả lời của người khác không phải là cách tuyệt vời để khiến họ có động cơ trả lời một trong những câu hỏi của bạn. –

0

trong trường hợp bạn đồng ý có con như đối tượng/băm thay vì mảng, đây là giải pháp của tôi dựa trên Jordan https://stackoverflow.com/a/2299268/214420

var el1 = {name:'ronaldo', team: 'europe/spain/realmadrid'} 
var el2 = {name:'messi', team: 'europe/spain/barcelona'} 
var el3 = {name:'gerald', team: 'europe/england/liverpool'} 
var el4 = {name:'unknown english', team: 'europe/england'} 

data = [el1,el2,el3,el4] 
tree = {}; 
for(var i =0; i < data.length;i++){ 
    var steps = data[i].team.split('/'); 

    steps.push(data[i].name) 
    var current = tree; 

    for(var j = 0 ; j < steps.length;j++){ 
     var step = steps[j] 
     current.leaf = false; 
     current.children = current.children || {}; 
     current = current.children 
     current[step] = current[step] || {text:step,leaf:true} 
     current = current[step]; 
    } 
} 
0

Tạo mảng dữ liệu phẳng của bạn và so với quá trình trên dữ liệu cho việc tìm kiếm lồng nhau json

như

[{"itemname": "item1","settingkey": "key1","settingvalue": "value1"}, {"itemname": "item2","settingkey": "key2","settingvalue": "value2"},]; 

và sau đó xử lý này

var keys = Object.keys(dataMap); 

var json = []; 
for (var key in keys) { 
     var innerJson = {}; 
     innerJson["name"] = keys[key]; 
     var innerMap = dataMap[keys[key]]; 

     if (innerMap instanceof Array) { 
      innerJson["size"] = innerMap[0]; 
     } else if (innerMap instanceof Object) { 

      var child = processHirarchiachalData(innerMap); 
      innerJson["children"] = child; 
     } 
     json.push(innerJson); 

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