2013-07-16 10 views
6

मेरे पास निम्न कोड है और मैं 52 अलग-अलग कार्डों से भरा डेक सरणी बनाना चाहता हूं। जब भी मैं कोड चलाता हूं और कार्ड ऑब्जेक्ट को सतर्क किया जाता है तो यह '[ऑब्जेक्ट ऑब्जेक्ट]' के रूप में प्रदर्शित होता है।ऑब्जेक्ट प्रॉपर्टी को सरणी मान देना?

क्या कोई मुझे समझा सकता है कि यह ऐसा क्यों करता है और इस समस्या का समाधान क्यों करता है?

var suits = ["Clubs", "Diamonds", "Hearts", "Spades"]; 
var ranks = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"]; 
var deck = []; 

for (var i = 0; i < suits.length; i++) { 
    for (var j = 0; j < ranks.length; j++) { 
     var card = {rank: ranks[j], suit: suits[i]}; 
     deck.push(card); 
     alert(card) 
    } 
} 
+0

आप 'card.rank' या' card.suit' को अलर्ट कर सकते हैं लेकिन कार्ड नहीं। – DevlshOne

+0

[जावास्क्रिप्ट ऑब्जेक्ट को कैसे अलर्ट करें] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3580754/how-to-alert-javascript-object) या [जावास्क्रिप्ट ऑब्जेक्ट की प्रिंट सामग्री?] (Http: // stackoverflow। कॉम/प्रश्न/1625208/जावा -स्क्रिप्ट-ऑब्जेक्ट की प्रिंट-सामग्री) – Bergi

उत्तर

6

यह इस

क्यों यह पूरी तरह से सामान्य है। आपके द्वारा बनाए गए कार्ड ऑब्जेक्ट को यह नहीं पता कि जब आप अपना alert() करते हैं, तो केवल toString() विधि कार्यान्वयन नहीं करते हैं। आपकी समस्या के लिए

समाधान

इस तरह प्रत्येक कार्ड वस्तु को एक गुमनाम toString() समारोह कार्यान्वयन निर्दिष्ट करने का प्रयास:

var suits = ["Clubs", "Diamonds", "Hearts", "Spades"]; 
var ranks = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"]; 
var deck = []; 

for (var i = 0; i < suits.length; i++) { 
    for (var j = 0; j < ranks.length; j++) { 

     var card = { 
         rank: ranks[j], 
         suit: suits[i], 
         toString : function() { return this.rank + ' ' + this.suit; } 
        }; 

     deck.push(card); 

     //alert(card); // console.log doesn't block code execution 
     console.log(card.toString()); 
    } 
} 

नोट

आप alert() के बजाय console.log() उपयोग करने पर विचार करना चाहिए क्योंकि यह कंस में डीबग करने के लिए बहुत कम परेशान और आसान है एकमात्र (हिट एफ 12)। लेकिन आईई 9 या उससे कम उत्पादन वाले उत्पादन कोड से सावधान रहें क्योंकि डेवलपर कंसोल खोले जाने पर उनके जावास्क्रिप्ट इंजन क्रैश हो जाएंगे।

+0

मैं या तो 'अलर्ट (कार्ड)' (स्पष्ट रूप से 'अलर्ट (card.toString())') * या * कंसोल का उपयोग करता हूं।लॉग (कार्ड) ', उनमें से एक मिश्रण नहीं :-) – Bergi

+0

निश्चित रूप से, इसीलिए मैंने उदाहरण में 'अलर्ट()' कॉल पर टिप्पणी की। ;) –

+0

इसके लिए धन्यवाद, मुझे कंसोल.लॉग() और अलर्ट() के साथ उलझन में मिला, अब सब काम कर रहे हैं। – Tim

0

है कि कैसे एक वस्तु से पता चला है, इसकी toString विधि आउटपुट सिर्फ इतना है कि, उसकी सामग्री

alert(JSON.stringify(card)); 
+0

अस्वीकरण: जब आपके पास बिल्कुल नया ब्राउज़र है तो JSON.stringify डीबगिंग के लिए बहुत अच्छा है। हालांकि, सार्वजनिक रूप से उपयोग किए जाने वाले ब्राउज़र की निराशाजनक संख्या इसका समर्थन नहीं करती है, इसलिए बस फॉलबैक होना सुनिश्चित करें, या उत्पादन कोड के लिए लॉगिंग को हटा दें। – Katana314

0

FIDDLE DEMO

का उपयोग इस के साथ अपनी चेतावनी की जगह को देखने के लिए -> चेतावनी (JSON .stringify (कार्ड))

var suits = ["Clubs", "Diamonds", "Hearts", "Spades"]; 
var ranks = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"]; 
var deck = []; 

for (var i = 0; i < suits.length; i++) { 
    for (var j = 0; j < ranks.length; j++) { 
     var card = {rank: ranks[j], suit: suits[i]}; 
     deck.push(card); 
     alert(JSON.stringify(card))//CHANGE THIS... 
     console.log(JSON.stringify(card)) 
    } 
} 

EXPLANATION

JSON.stringify जेएसओएन पाठ में जावास्क्रिप्ट डेटा संरचनाओं को परिवर्तित करता है। जेसन टेक्स्ट कुछ भी नहीं है लेकिन टेक्स्ट की मूल्य जोड़ी है। यह आसान नहीं हो सकता है।

2

ऐसा इसलिए होता है क्योंकि आप संपूर्ण ऑब्जेक्ट को अलर्ट करने के लिए निर्दिष्ट करते हैं, और अलर्ट नहीं जानता कि कौन से गुण प्रासंगिक हैं। यदि आप अपनी ऑब्जेक्ट का विस्तार योग्य दृश्य चाहते हैं, तो आप console.log(card) का उपयोग कर सकते हैं, यह ब्राउज़र ऑब्जेक्ट कंसोल में पेड़-व्यू के रूप में आपकी ऑब्जेक्ट को आउटपुट करेगा।

0

आप इस के लिए अपनी अलर्ट बदलना चाहिए:

alert(JSON.stringify(card)) 
संबंधित मुद्दे