2012-06-30 17 views
5

मैं कई वस्तुओं के माध्यम से लूप करने की कोशिश कर रहा हूं, और एक जेसन ऑब्जेक्ट बना रहा हूं। प्रत्येक पाश वस्तु पर एक नई वस्तु होनी चाहिए, लेकिन मुझे कुछ समस्याएं हो रही हैं। ऐसा लगता है कि कई लोगों की बजाय आइटमों का केवल एक सेट जोड़ा जाता है।लूप के साथ एक जेसन ऑब्जेक्ट कैसे बनाया जाए?

jsonObj = {} 
rows.each(function (index) { 
    jsonObj["id"] = $this.find('.elementOne').val(); 
    jsonObj["name"] = $this.find('.elementTwo').text(); 

}); 

यहाँ क्या मेरी json लग रहा है जैसे:

यहाँ मेरी कोड है

{ 
    id: "1" 
    name: "Stuff" 
}, 
{ 
    id: "2" 
    name: "Stuff" 
}, 
{ 
    id: "3" 
    name: "Stuff" 
} 
+4

तकनीकी तौर पर होती है "JSON ऑब्जेक्ट" जैसी कोई चीज़ नहीं - JSON एक _string_ _JavaScript ऑब्जेक्ट_ का प्रतिनिधित्व करता है। आप यहां क्या कर रहे हैं _JavaScript ऑब्जेक्ट_ है, जेएसओएन नहीं। –

+0

JSON एक स्ट्रिंग है जो एक डेटा संरचना का प्रतिनिधित्व करता है जिसे कई प्रोग्रामिंग भाषाओं के साथ पार्स किया जा सकता है। यह जावास्क्रिप्ट के सबसेट पर आधारित है, लेकिन डेटा प्रकारों का समर्थन करता है जो कई भाषाओं में प्रदर्शित होता है। – Quentin

उत्तर

25

यहां कोई JSON है। कृपया भ्रमित न करें:

  • JavaScript ऑब्जेक्ट (डेटा संरचना)
  • ऐसा JavaScript
  • JSON (एक डेटा वस्तु के एक उपसमूह पर आधारित प्रारूप (जैसे एक डेटा संरचना बनाने के लिए कोड) शाब्दिक आपत्ति शाब्दिक नोटेशन)

यदि आप वस्तुओं की ऑर्डर सूची (या किसी अन्य प्रकार की जावास्क्रिप्ट डेटा संरचना) चाहते हैं तो एक सरणी का उपयोग करें। Arrays में push विधि है।

var myData = []; 
rows.each(function (index) { 
    var obj = { 
     id: $this.find('.elementOne').val(), 
     name: $this.find('.elementTwo').text() 
    }; 
    myData.push(obj); 
}); 
1
var jsonObj = []; 
rows.each(function(index) { 
    jsonObj.push({ 
     id: $this.find('.elementOne').val(), 
     name: $this.find('.elementTwo').text() 
    }); 
}); 
4

:

{ 
    id: "3" 
    name: "Stuff" 
}, 

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

फिक्स्ड कोड एक सरणी का उपयोग कर:

jsonObj = []; 
rows.each(function(index) { 
    jsonObj.push({ 
     'id': $this.find('.elementOne').val(), 
     'name': $this.find('.elementTwo').text() 
    }); 
});​ 
2

इसका कारण यह है कि आप केवल अपने वस्तु, id और name, हर बार की इसी गुण को अधिलेखित कर रहे हैं। आपको प्रत्येक के लिए उप-ऑब्जेक्ट बनाने की आवश्यकता है, फिर इसे मास्टर ऑब्जेक्ट में दबाएं (जिसे मैंने सरणी में परिवर्तित कर दिया है, क्योंकि यह गैर-सहयोगी है)।

var jsonObj = [] 
rows.each(function (index) { 
    var temp_obj = {}; 
    temp_obj["id"] = $this.find('.elementOne').val(); 
    temp_obj["name"] = $this.find('.elementTwo').text(); 
    jsonObj.push(temp_obj); 
}); 

[संपादित करें] - मार्क Eirich का जवाब है, जैसा कि temp_obj अनावश्यक है - आप एक गुमनाम वस्तु के बजाय धक्का सकता है, लेकिन मैं temp_obj परिभाषित बस इसे साफ क्या हो रहा है बनाने के लिए।

क्वेंटिन के बहुत अच्छे अंक भी पढ़ें: जावास्क्रिप्ट ऑब्जेक्ट्स और जेएसओएन के बीच आम भ्रम।

4

आप जो चाहते हैं वह वस्तुओं की एक श्रृंखला है। जब आप एक ही वस्तु को एक ही ऑब्जेक्ट पर कई बार लिखने का प्रयास करते हैं, तो यह ओवरराइट हो जाता है, यही कारण है कि आप id और name को लूप के अंतिम पुनरावृत्ति के लिए मान रखते हैं।

आप jQuery के साथ सवाल टैग नहीं किया गया है हालांकि, यह jQuery कैसा दिखाई देता है, तो यहाँ एक समाधान है:

मैं स्वतंत्रता लिया है this को $this बदलने के लिए, क्योंकि $this ही की चर्चा करते हुए किया जा रहा है प्रत्येक चरण में वस्तु है, जो अब है कि तुम क्या चाहते हो सकता है (मुझे मालूम होता है)

var myArray = rows.map(function() { 
    return { 
     id: $(this).find('.elementOne').val(), 
     name: $(this).find('.elementTwo').text() 
    }; 
}); 
+0

यहां सबसे अच्छा जवाब है। अच्छा एन साफ! +1। – gdoron

1

आप jQuery के साथ इस तरह कर सकते हैं। फ़ंक्शन प्रकार इनपुट के फॉर्म तत्वों की अपेक्षा करेगा। यह पारित कर दिया फार्म के लिए अधिक पुनरावृति जाएगा प्रत्येक इनपुट नाम और मान एकत्रित करेगा और यह

exmple की तरह एक json वस्तु बना देगा:

एचटीएमएल

<form action="" method="post" id="myForm"> 
    <input type="text" name="field1" value="I a value of field 1"/> 
    <input type="text" name="field2" value="I a value of field 2"/> 
</form> 

जावास्क्रिप्ट

function buildObject(form) { 
      var jsonObject = [], 
       tempObj = {}; 
      $(form).find("input:not(input[type='submit'])").each(function() { 
       tempObj[$(this).attr("name")] = $(this).val(); 
      }); 

      jsonObject.push(tempObj); 

      return jsonObject[0]; 
    } 
    buildObject($("#myForm")); 
    //Will produce 

    jsonObj = { 
     field1 : "I a value of field 1", 
     field2 : "I am value of field 2"  
    } 
संबंधित मुद्दे