2012-05-18 6 views
12

मैं अब यह करने के लिए कोशिश कर रहा हूँ में एक साहचर्य सरणी शामिल होने के लिए और मुझे आश्चर्य है कि अगर वहाँ एक "सबसे अधिक इस्तेमाल किया" एक साहचर्य सरणी (यह मान) एक स्ट्रिंग में एक चरित्र से सीमांकित शामिल होने के लिए विधि।कैसे एक स्ट्रिंग

var AssocArray = { id:0, status:false, text:'apple' }; 

स्ट्रिंग इस वस्तु के तत्वों में शामिल होने से हुई उदाहरण के लिए, मैं है

"0, false, 'apple'" or "0, 0, 'apple'" 

हो सकता है अगर हम उन्हें एक "," चरित्र किसी भी विचार के साथ शामिल हो? धन्यवाद!

+1

कि करने के लिए कोई अंतर्निहित विधि नहीं है; बस कोड का एक छोटा सा टुकड़ा लिखें। ध्यान रखें कि 'लूप इन ... लूप द्वारा लौटाए गए गुणों का क्रम अनुमानित नहीं होगा, इसलिए यदि आप मानों को ऑर्डर करने के कुछ कैननिकल तरीके को लागू करना चाहते हैं तो आपको कुछ खुद को सोचना होगा। – Pointy

उत्तर

9

बस सरणी के माध्यम से लूप।

var AssocArray = { id:0, status:false, text:'apple' }; 
    var s = ""; 
    for (var i in AssocArray) { 
     s += AssocArray[i] + ", "; 
    } 
    document.write(s.substring(0, s.length-2)); 

विल उत्पादन: 0, false, apple

+1

'मैं AssocArray में' 'वर AssocArray में मैं' होना चाहिए, जिससे कि यह वैश्विक नामस्थान को दूषित नहीं है। – pseudosavant

+0

बहुत सच है, इस तरह की चीज मैंने इस उदाहरण में नहीं ली है। – Hidde

+0

हो सकता है कि आपको 'hasOwnProperty' का उपयोग करके एक चेक जोड़ना चाहिए: '(varocArray में var i) { ** यदि (AssocArray hasOwnProperty (i)) ** s + = AssocArray [i] +", "; } ' देखें: http://stackoverflow.com/questions/921789/how-to-loop-through-plain-javascript-object-with-objects-as-members –

17
Object.keys(AssocArray).map(function(x){return AssocArray[x];}).join(','); 

पुनश्च: वहाँ Object.values विधि कहीं है, लेकिन यह एक मानक नहीं है। और hashish जैसे बाहरी पुस्तकालय भी हैं।

+2

मैं वास्तव में एक-लाइनर्स पसंद है, लेकिन आप मन में दो बातें रखने के लिए: यह आईई <9 के लिए काम नहीं करता है, और का उपयोग कर 'map' बहुत बड़ी वस्तु के लिए धीमी गति से हो सकता है। – MaxArt

+1

1) यह आईई <9 के लिए संगतता पुस्तकालयों के साथ काम करता है; 2) स्ट्रिंग कॉन्सटेनेशन भी धीमा है ... इसलिए वास्तव में बड़ी वस्तुओं के लिए आपको node.js में धाराओं जैसे पूरी तरह से एक और दृष्टिकोण का उपयोग करना है (लेकिन वास्तव में, यह प्रश्न में नहीं है) – alex

+1

अली ने अन्य पुस्तकालयों का उपयोग करने के बारे में कुछ भी नहीं बताया, लेकिन वैसे भी , कॉलिंग फ़ंक्शंस स्ट्रिंग कॉन्सटेनेशन की तुलना में धीमी गति से है, और यदि आप तारों को संयोजित नहीं करना चाहते हैं तो भी आप हमेशा अस्थायी सरणी का उपयोग कर सकते हैं और अंत में 'join' का उपयोग कर सकते हैं। – MaxArt

5

Object.map, Object.forEach जैसे कार्यों के कार्यान्वयन और इतने पर अभी भी चर्चा हो रही है जावास्क्रिप्ट में कोई सरणी सूचकांक, यहां तक ​​कि साहचर्य सरणियों है। अभी के लिए, आप कुछ इस तरह के साथ छड़ी कर सकते हैं:

function objectJoin(obj, sep) { 
    var arr = [], p, i = 0; 
    for (p in obj) 
     arr[i++] = obj[p]; 
    return arr.join(sep); 
} 

संपादित: एक अस्थायी सरणी का उपयोग करने और प्रदर्शन में सुधार के लिए स्ट्रिंग संयोजन की यह बजाय में शामिल होने।

संपादित 2: ऐसा लगता है कि arr.push(obj[p]); बजाय एक काउंटर incrementing की वास्तव में तेजी सबसे में हाल ही में ब्राउज़रों के हो सकता है। टिप्पणी देखो।

+0

क्या कोई कारण है कि आप अभी उपयोग नहीं कर रहे हैं 'arr.push (obj [p])' arr के बजाय 'i ++] = obj [p] '? – pseudosavant

+0

ऐसा इसलिए है क्योंकि भले ही 'push' एक बहुत तेजी से कार्य है यह फिर भी एक कार्यों है, और एक समारोह बुला समय महंगा है।कई ब्राउज़रों के पास आजकल इसके लिए विशेष अनुकूलन है, लेकिन यह हमेशा ऐसा नहीं होता है। एक और तकनीक में 'तत्वों को' नया एरे (लेंटघ) 'के साथ अपने तत्वों को आवंटित करने से पहले सरणी को आयाम में शामिल किया गया है, लेकिन इसे केवल' लंबाई 'ज्ञात होने पर ही किया जा सकता है, और ऐसा नहीं है। – MaxArt

+1

एक समयपूर्व अनुकूलन की तरह लगता है। ऐसा लगता है कि इन दो तरीकों के बीच प्रदर्शन बहुत भिन्न होता है, और 'सर्वश्रेष्ठ' तरीका ब्राउज़र के उपयोग पर निर्भर करता है। इस जेएसपीआरएफ उदाहरण को देखें: http://jsperf.com/array-increment-vs-array-push – pseudosavant

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