2010-02-19 11 views
10

इन 4 चर को देखते हुए से एक JSON ट्री बनाना,एक स्ट्रिंग पदानुक्रम

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'} 

मैं इस JSON पेड़ पदानुक्रम उत्पादन की जरूरत है,

{ 
    "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 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

उत्तर

12

यह waaay आसान होगा अगर किसी भी तरह EL1-EL4

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'} 

इस तरह से आप प्रोसेस करते समय कम से कम लूप कर सकते हैं।

यह जानना भी उपयोगी होगा कि आपको JSON वृक्ष के रूप में संग्रहीत करने की आवश्यकता क्यों है। मेरा मतलब है, सभी नोड्स एक ही तरह की चीज नहीं हैं, है ना? पहला स्तर महाद्वीप है, फिर देश, फिर टीम का नाम, और पत्तियां व्यक्तिगत फुटबॉल खिलाड़ी हैं। यह एक काफी भ्रमित डेटा संरचना है और मुझे यकीन नहीं है कि यह कैसे उपयोगी होगा। किसी भी तरह से, इसे पहले क्षेत्रबद्ध संरचना में अनुवाद करने के लिए और फिर पेड़ उत्पन्न करने के लिए और अधिक उपयोगी हो सकता है।

संपादित करें: ठीक है, इसलिए मैंने इसके बारे में कुछ और सोचा और मुझे लगता है कि ऐसा कुछ ऐसा हो सकता है।

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) 
} 

यह एक जावास्क्रिप्ट ऑब्जेक्ट बनाता है। मैं इसे JSON में बदलने के लिए आपको छोड़ देता हूं।

अद्यतन:

हाँ, मुझे लगता है कि पुरानी स्क्रिप्ट हमेशा होता है दूसरे स्तर भले ही वह पहले से ही अस्तित्व में है पर में एक रिकॉर्ड डाल दिया।

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 }) 
} 

JSON में इस वस्तु कन्वर्ट करने के लिए सबसे आसान तरीका है, जाहिरा तौर पर है, हालांकि जाहिरा तौर पर इस समान रूप से समर्थित नहीं है (see the JavaScript JSON Page) JSON.stringify(tree) उपयोग करने के लिए है: इस नए बेहतर FillTree कार्य है।

+0

धन्यवाद जॉर्डन, लेकिन यूरोप में केवल 2 बच्चे (स्पेन और इंग्लैंड) होना चाहिए – user275031

+0

@Dementic धन्यवाद! यदि आपके पास एक अच्छा समाधान है, तो कृपया इसे पोस्ट करें। –

+1

जो कोड मैंने लिखा है वह इनपुट लेता है और वास्तव में वांछित आउटपुट बनाता है। एकमात्र अंतर यह है कि यह एक जावास्क्रिप्ट संरचना के रूप में आउटपुट है, जिसे ओपी जेएसओएन में कनवर्ट करने के लिए स्वतंत्र है, जो भी वह चाहता है। यदि आप सोच रहे थे, किसी और के जवाब की अनियंत्रित रूप से आलोचना करना उनके लिए अपने किसी एक प्रश्न का उत्तर देने के लिए प्रेरित करने का एक शानदार तरीका नहीं है। –

0

मामले में आप के रूप में वस्तु/सरणी के बजाय हैश बच्चे पैदा करने की सहमति व्यक्त करते हैं, यहाँ मेरी समाधान पर जॉर्डन के 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

नेस्टेड json

को खोजने के लिए अपने फ्लैट डेटा सरणी और डेटा पर प्रक्रिया से बनाएं आधारित है

तरह

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

और फिर इस

०१२३५१६४१०६ की प्रक्रिया
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); 

} 
संबंधित मुद्दे