jQuery

2011-06-03 3 views
15

के साथ सीमांकित स्ट्रिंग को पदानुक्रमित जेएसओएन में कनवर्ट करें मेरे पास तारों की एक सरणी है जो डैश के साथ सीमित होने से माता-पिता/बाल संबंध का वर्णन करती है। इसलिए, यदि बॉब का मालिक जिम और जिम का मालिक फ्रेड था, तो सरणी में बॉब की प्रविष्टि "फ्रेड-जिम-बॉब" होगी और जिम की प्रविष्टि "फ्रेड-जिम" होगी।jQuery

{ 
    "name": "Fred", 
    "children": { 
     "name": "Jim", 
     "children": { 
      "name": "Bob" 
     } 
    } 
} 

किसी भी मदद होगी: मैं जिस तरह से डेटा तो मैं मदद के लिए देख रहा था में आ रहा है बदलने के लिए जहाँ तक इस के समान JSON में इन मूल्यों को बदल का सबसे अच्छा तरीका के रूप में की क्षमता नहीं है अत्यधिक सराहनीय। धन्यवाद।

+0

आप इनपुट स्ट्रिंग का एक उदाहरण दे सकते हैं? भी, क्या यह अनंत स्तर से नीचे जाता है, या यह 3 तक सीमित है? – Jason

+0

वैसे यह ऊपर दिखाए गए लोगों की तरह तारों की एक सरणी होगी। इसलिए जेसन के लिए मैंने उपरोक्त वर्णित किया है: var emp = new Array ("फ्रेड-जिम", "फ्रेड", "फ्रेड-जिम-बॉब"); और हाँ यह 3 से अधिक या कम हो सकता है – Munzilla

उत्तर

29
var input = ["Fred-Jim-Bob", "Fred-Jim", "Fred-Thomas-Rob", "Fred"]; 
var output = []; 
for (var i = 0; i < input.length; i++) { 
    var chain = input[i].split("-"); 
    var currentNode = output; 
    for (var j = 0; j < chain.length; j++) { 
     var wantedNode = chain[j]; 
     var lastNode = currentNode; 
     for (var k = 0; k < currentNode.length; k++) { 
      if (currentNode[k].name == wantedNode) { 
       currentNode = currentNode[k].children; 
       break; 
      } 
     } 
     // If we couldn't find an item in this list of children 
     // that has the right name, create one: 
     if (lastNode == currentNode) { 
      var newNode = currentNode[k] = {name: wantedNode, children: []}; 
      currentNode = newNode.children; 
     } 
    } 
} 

उत्पादन JSONifies के रूप में:

[{ 
    "name": "Fred", 
    "children": [{ 
     "name": "Jim", 
     "children": [{ 
      "name": "Bob", 
      "children": [] 
     }] 
    }, { 
     "name": "Thomas", 
     "children": [{ 
      "name": "Rob", 
      "children": [] 
     }] 
    }] 
}] 
+0

ओपी टिप्पणियों का कहना है कि इसे अनंत स्तरों के लिए काम करना चाहिए। –

+1

उदाहरण इनपुट में स्ट्रिंग्स होते हैं जो 3 स्तर तक जाते हैं, लेकिन अधिक जोड़ने के लिए आपका स्वागत है। उदाहरण लोड करने का प्रयास करें और तारों में से एक को "फ्रेड-जिम-बॉब-मार्क" कहें। आप देखेंगे कि यह भी ठीक काम करता है। गणितीय अनंतता शायद यह संभाल नहीं पाएगी, लेकिन ब्राउज़र मेमोरी के संबंध में उचित सीमाओं के भीतर कुछ भी काम करना चाहिए। – Gijs

+0

हां, मैं इसका उपयोग किसी कंपनी के संगठन चार्ट के लिए डेटा को पार्स करने के लिए कर रहा हूं, इसलिए मुझे इन्फिनिट स्तर की आवश्यकता नहीं है, लेकिन 3. – Munzilla