2012-06-26 3 views
7

मैं ढांचा बनाने के लिए एक विशिष्ट खेल का उपयोग कर रहा है, लेकिन मुझे लगता है कि सवाल जावास्क्रिप्टजावास्क्रिप्ट सरणी में वस्तुओं धक्का बदलता है पूरे सरणी

मैं एक कथन स्क्रिप्ट बनाने के लिए तो खिलाड़ी "देख सकते हैं Orc आप हिट कोशिश कर रहा था पर लागू होता है । " उसकी स्क्रीन के नीचे। मैं एक बार में अंतिम 4 संदेश दिखाना चाहता था और संभवतः खिलाड़ी को लॉग में 30-50 संदेशों को देखने के लिए देखने की अनुमति देता हूं। ऐसा करने के लिए मैंने वस्तुओं को धक्का देने के लिए सेट अप और ऑब्जेक्ट और एक सरणी बनाई है।

तो मैं कुछ चर इस शुरू में की तरह

servermessage: {"color1":"yellow", "color2":"white", "message1":"", "message2":""}, 
servermessagelist: new Array(), 

सेट ... और जब मैं servermessage.color1 जोड़ तोड़ ... द्वारा इस आदेश (नीचे) अलग डेटा एक घटना से बुलाया एक से अधिक बार का उपयोग करें। message1 आदि ...

servermessagelist.push(servermessage) 

यह है कि डेटा की प्रतियां के साथ पूरे सरणी ... किसी भी विचार क्यों या क्या मैं इसके बारे में क्या कर सकते हैं अधिलेखित कर देता है।

तो अगर मैं रंग 1 "लाल" और संदेश 1 "रोवर" दबाता हूं तो डेटा सही है यदि मैं रंग 1 "पीला" और संदेश 1 "बस" धक्का देता हूं तो डेटा दो रंगों की है। रंग 1: "पीला"। संदेश 1: "बस"

+0

आपका क्या मतलब है "संपूर्ण डेटा को उस डेटा की प्रतियों के साथ ओवरराइट करता है"? क्या आप कोड दिखा सकते हैं जिसका उपयोग आप परिणामी सरणी को फिर से करने के लिए करते हैं? –

उत्तर

16

जब आप servermessageservermessagelist में धक्का देते हैं तो आप वास्तव में (अधिक या कम) उस ऑब्जेक्ट के संदर्भ को दबाते हैं। इसलिए servermessage पर किए गए कोई भी परिवर्तन हर जगह परिलक्षित होते हैं जब आपके पास इसका संदर्भ होता है। ऐसा लगता है कि आप जो करना चाहते हैं वह वस्तु के क्लोन को सूची में धक्का दे रहा है।

एक समारोह घोषित इस प्रकार है:

function cloneMessage(servermessage) { 
    var clone ={}; 
    for(var key in servermessage){ 
     if(servermessage.hasOwnProperty(key)) //ensure not adding inherited props 
      clone[key]=servermessage[key]; 
    } 
    return clone; 
} 

तो हर आप सूची में संदेश पुश करने के लिए चाहते हैं:

servermessagelist.push(cloneMessage(servermessage)); 
+0

क्या वस्तुओं का सरणी घोषित करके मैं ऐसा कर सकता हूं ??? मुझे नहीं पता कि यह कैसे करना है। – Shawn

+0

हर बार जब आप 'सर्वर मैसेज' को धक्का देने जा रहे हैं तो आपको यह क्लोनिंग करना होगा। एक बार इसे बदलने के बाद, इसे क्लोन करें, फिर उसके क्लोन को दबाएं। – nbrooks

+0

अच्छी तरह से आप पहली वस्तु से गुणों का उपयोग करके प्रत्येक बार एक नई वस्तु घोषित कर सकते हैं और मानों को 'शून्य' या ' – nbrooks

1

सर्वरमेसेगेलिस्ट: नया ऐरे() प्रत्येक बार निष्पादित होने पर सरणी खाली करता है। मूल रूप से सरणी प्रारंभ करने पर केवल उस कोड को निष्पादित करें।

+0

संदेश सूची मेरे शुरुआती फ़ंक्शन में है पुश एक अपडेट फ़ंक्शन में है जो वेबस्केट ईवेंट पर चलाया जाता है ... – Shawn

+0

आह, मेरा बुरा, मुझे आपके कोड उदाहरण से यह नहीं मिला।लेकिन जैसा कि nbrooks ने कहा, जावास्क्रिप्ट वस्तुओं में हमेशा संदर्भ के रूप में पारित किया जाता है और यही कारण है कि यह सही ढंग से काम नहीं कर रहा है। – riku

2

जब आप सरणी वस्तु जोड़ने के लिए, यह केवल एक संदर्भ है जो वस्तु जोड़ा गया है उसे। ऑब्जेक्ट को सरणी में जोड़कर कॉपी नहीं किया गया है। इसलिए, जब आप बाद में ऑब्जेक्ट को बदलते हैं और इसे सरणी में फिर से जोड़ते हैं, तो आपके पास एक ही ऑब्जेक्ट के कई संदर्भों के साथ एक सरणी होती है।

सरणी के लिए प्रत्येक इसके अलावा के लिए एक नई वस्तु बनाएँ:

servermessage = {"color1":"yellow", "color2":"white", "message1":"", "message2":""}; 
servermessagelist.push(servermessage); 
servermessage = {"color1":"green", "color2":"red", "message1":"", "message2":"nice work"}; 
servermessagelist.push(servermessage); 
0

मैं भी यही समस्या हुई। मेरे पास थोड़ा जटिल ऑब्जेक्ट था कि मैं सरणी में धक्का दे रहा था। मैंने क्या किया; मैं जेएसओएन ऑब्जेक्ट को JSON.stringify() का उपयोग करके स्ट्रिंग के रूप में कनवर्ट करता हूं और ऐरे में धक्का देता हूं।

जब यह सरणी से लौट रहा है तो मैं JSON.parse() का उपयोग करके उस स्ट्रिंग को JSON ऑब्जेक्ट में परिवर्तित करता हूं।

यह मेरे लिए ठीक काम कर रहा है हालांकि यह थोड़ा अधिक समाधान समाधान है। यहां पोस्ट करें यदि आपके पास वैकल्पिक विकल्प हैं