2012-01-23 7 views
5

क्षमा करें, मैं अपने स्वयं उलझन में था, लेकिन अब मैं एक उचित उदाहरण है:JSON.stringify (वस्तु) मेरा आखिरी सवाल इतनी भ्रमित होने के लिए गलत

var obj = {}; 
obj.entities = []; 
obj.entities["player"] = []; 
obj.entities["player"]["0"] = []; 
obj.entities["player"]["0"]["pos"] = "0,0"; 

var jsonStr = JSON.stringify(jsonObj); 

// {"entities":[]} 
console.log(JSON.stringify(obj)); 

JSON.stringify(obj) के उत्पादन में गलत है के रूप में आप देख सकते हैं । इसका कारण क्या है?

+0

+1 बहुत सुधार हुआ! ;) –

उत्तर

12

आप पहली बार, एक सरणी ([]) का निर्माण कर रहे तो गैर नंबर कुंजियों (player) के साथ यह करने के गुण बताए। यह तकनीकी रूप से संभव है (जैसा कि त्रुटि उत्पन्न नहीं होता है), लेकिन यह नहीं है कि सरणी क्या हैं।

आपको ऑब्जेक्ट्स () का उपयोग करना चाहिए। इसके अलावा, ["player"].player जैसा ही है।

var obj = {}; 
obj.entities = {}; 
obj.entities.player = []; // array here because you're filling with indices ([0]) 
obj.entities.player[0] = {}; // object again, because non-indices as keys (`pos`) 
obj.entities.player[0].pos = "0,0"; 

ऑब्जेक्ट्स कोई भी संपत्ति कुंजी ले सकते हैं। Arrays ऑब्जेक्ट्स का सबसेट है, जिसमें केवल इंडेक्स (संख्या >= 0) कुंजी के रूप में होनी चाहिए।

+0

आह, स्पष्टीकरण के लिए धन्यवाद, मैं वस्तु-सरणी अंतर के बारे में पूरी तरह से अवगत नहीं था। लेकिन मैं अभी भी 'obj.entities.player = {};' और फिर 'obj.entities.player.pos = "0,0" कर सकता था; क्या मैं नहीं कर सका? –

+0

@ elias94xx: यदि आपके पास एक खिलाड़ी है, तो यह संभव होगा। यद्यपि आपने लिखा ['0 "]' मुझे लगता है कि आपके पास किसी भी तरह के खिलाड़ियों की एक सूची (सरणी) है। – pimvdb

+0

हाँ क्षमा करें, मैं एक सेकंड के लिए आईडी के बारे में भूल गया। :) –

1

आप वस्तु कुंजी/मूल्य जोड़े के बजाय नामित सरणी indeces का उपयोग कर रहे हैं।

var obj = {}; 
obj.entities = {}; 
obj.entities["player"] = {}; 
obj.entities["player"]["0"] = []; 
obj.entities["player"]["pos"] = "0,0"; 

// {"entities":{"player":{"0":[],"pos":"0,0"}}} 
console.log(JSON.stringify(obj)); 
1

entities, और entities["player"] और entities["player"]["0"]वस्तुओं, सरणियों नहीं होना चाहिए।

आप इन सरणी को गुणों को जोड़ने के बजाय इन सरणी में गुण जोड़ रहे हैं। ये कस्टम गुण स्ट्रिंग नहीं हो रहे हैं।

ठीक सरल है:

var obj = {}; 
obj.entities = {}; // <------------ this is an object now 
obj.entities["player"] = {}; // <--------- also an object 
obj.entities["player"]["0"] = {}; // <-------- and so on 
obj.entities["player"]["0"]["pos"] = "0,0"; 
3

आपका जीवन बहुत आसान हो सकता है अगर आप JSON में अपनी वस्तुओं निर्धारित करेंगे के साथ शुरू:

var obj = { 
    'entities': [ 
    {'player':{'pos': '0,0'}} 
    ] 
}; 
1

मुझे लगता है कि आप सरणियों और जावास्क्रिप्ट की वस्तुओं के बारे कुछ गंभीर भ्रम है। एक सरणी ([]) केवल सकारात्मक पूर्णांक अनुक्रमणिका के साथ काम करता है। अपने उदाहरण में आप निम्न कार्य कर रहे हैं:

obj.entities = []; 
obj.entities["player"] = []; 

आप कहते हैं कि obj.entities एक सरणी है और फिर आप सूचकांक के रूप में player का उपयोग करें। और player एक पूर्णांक नहीं है। तो इस कोड को कोई मतलब नहीं है। दूसरी ओर आप गुणों के साथ वस्तुओं का उपयोग कर सकते हैं। वे गुण स्ट्रिंग हो सकते हैं:

obj.entities = {}; 
obj.entities.player = []; 
obj.entities.player[0] = 'foo bar'; 
1

आप सरणी के साथ वस्तुओं को भ्रमित कर रहे हैं। निम्नलिखित कोड काम करेगा।

var obj = {}; 
obj.entities = {}; 
obj.entities.player = []; 
obj.entities.player[0] = {}; 
obj.entities.player[0].pos = "0,0"; 

चीजें आप गलत हो गया:

  1. एक सरणी केवल पूर्णांक अनुक्रमित हो सकता है। इसलिए यदि आप a को सरणी के रूप में उपयोग करना चाहते हैं तो यह एक ["1"] लिखना गलत है।
  2. सही ढंग से क्रमबद्ध करने के लिए, केवल एक ऑब्जेक्ट को गुणों का नाम दिया जा सकता है, जैसे object.entities.player या object.entities["player"]
+1

ध्यान दें कि कुंजी हमेशा तार होती है, इसलिए '[" 1 "]' या '[1]' के बीच कोई अंतर नहीं है। अंतिम केवल अधिक अर्थात् है। – pimvdb

+0

@pimvdb आप बिल्कुल सही हैं – frm

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