CoffeeScript में एक ऑब्जेक्ट में कुंजियों और मूल्यों पर पुनरावृति कैसे करें?


190

मेरे पास कहने के लिए एक ऑब्जेक्ट ("सहयोगी सरणी" है - जिसे एक सादे जावास्क्रिप्ट ऑब्जेक्ट के रूप में भी जाना जाता है):

obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"

मैं objनिम्नानुसार कॉफीस्क्रिप्ट का उपयोग करना चाहता हूं :

# CS
for elem in obj

JS के ऊपर CS कोड को bu में संकलित करें:

// JS
for (i = 0, len = obj.length; i < len; i++)

जो इस मामले में उचित नहीं है।


जावास्क्रिप्ट तरीका होगा, for(var key in obj)लेकिन अब मैं सोच रहा हूं: कॉफीस्क्रिप्ट में मैं यह कैसे कर सकता हूं?


4
JavaScript / CoffeeScript में "Arrays" संख्यात्मक सूचकांकों के साथ विशेष ऑब्जेक्ट हैं और एक lengthसंपत्ति जो केवल उच्चतम संख्यात्मक सूचकांक (प्लस 1) को संदर्भित करती है। आप जो चाहते हैं वह सिर्फ एक "वस्तु" है obj = {}:। Arrays ऑब्जेक्ट हैं, लेकिन आपके उदाहरण में एक का उपयोग करने का कोई कारण नहीं है।
ट्रेवर बर्नहैम

1
अच्छी बात ट्रेवर! मैंने इस संबंध में प्रश्न को थोड़ा कम भ्रामक / भ्रमित करने वाला माना है।
प्रति लंडबर्ग

जवाबों:


351

का उपयोग करें for x,y of Lप्रासंगिक प्रलेखन

ages = {}
ages["jim"] = 12
ages["john"] = 7

for k,v of ages
  console.log k + " is " + v

आउटपुट

jim is 12
john is 7

आप for own k,v of agesटिप्पणी में आरोन डफोर द्वारा उल्लिखित संस्करण पर भी विचार करना चाह सकते हैं । यह प्रोटोटाइप से विरासत में मिली संपत्तियों को बाहर करने के लिए एक चेक जोड़ता है, जो शायद इस उदाहरण में कोई समस्या नहीं है, लेकिन हो सकता है कि आप अन्य सामान के ऊपर निर्माण कर रहे हों।


12
यकीनन। ofजावास्क्रिप्ट के लिए कॉफीस्क्रिप्ट के संकलन in। यह भ्रम की एक आम बात है, लेकिन inसरणियों के साथ उपयोग करने के लिए अविश्वसनीय रूप से उपयोगी है। मैं कॉफीस्क्रिप्ट पुस्तक में इस बारे में बात करता हूं ।
ट्रेवर बर्नहम

3
arrजैसा कि arr = []आप का उपयोग नहीं करना चाहिए , आपको इनिशियलाइज़ नहीं करना चाहिए arr = {}। जावास्क्रिप्ट (और कॉफ़ीस्क्रिप्ट) सरणियों में संख्यात्मक सूचकांक होते हैं। ऑब्जेक्ट सहयोगी सरणियों / डाइक की तरह व्यवहार करते हैं।
मॉर्गन हैरिस

धन्यवाद, यह ट्रेवर और अन्य लोगों द्वारा पहले ही बताया जा चुका है, और मेरा उत्तर मूल प्रश्न कोड के लिए था। मैं वैसे भी स्पष्टता के लिए एक सादे वस्तु का उपयोग करने के लिए अपने उदाहरण को अपडेट करूंगा।
निक

13
हालांकि यह इस विशेष उदाहरण के लिए कोई फर्क नहीं पड़ता, यह लगता for own key, value of objहै कि ओपी की तलाश में करीब है।
हारून दुफोर

4

आप एक सरणी को इनिशियलाइज़ कर रहे हैं, लेकिन फिर आप इसे ऑब्जेक्ट की तरह उपयोग कर रहे हैं (js में कोई "साहचर्य सरणी नहीं है")।

वस्तुओं पर पुनरावृत्ति के लिए वाक्यविन्यास का उपयोग करें (कुछ इस तरह):

for key, val of arr
  console.log key + ': ' + val 

3
दरअसल, JS की सभी वस्तुएं साहचर्य सरणियाँ हैं (sans सुसंगत कुंजी क्रम)। तो कोड jcmoney काम करना चाहिए, वहाँ का उपयोग करने के कोई कारण नहीं है, हालांकि दिया []बजाय {}उस मामले में।
ट्रेवर बर्नहैम

jashkenas.github.com/cfish-script/#loops ऐसा लगता है कि कॉफ़ीस्क्रिप्ट द्वारा उत्पन्न लूप ऑब्जेक्ट-मेंबर्स पर पुनरावृति नहीं करेगा।
कियोपी

3

ऐरे कॉम्प्रिहेंशन का उपयोग करते हुए छोटा हाथ संस्करण, जिसे एक-पंक्ति लूप के रूप में इस्तेमाल किया जा सकता है।

console.log index + ": " + elm for index, elm of array

सरणी की समझ है:

"वैकल्पिक गार्ड क्लॉस और करंट एरे इंडेक्स के मान के साथ, लूप के लिए कॉम्प्रिहेंशन (और कंपाइल में) होता है। लूप्स के विपरीत, एरो कॉम्प्रिहेंशन एक्सप्रेशन होते हैं, और इन्हें लौटाया और असाइन किया जा सकता है।", http://coffeescriptcript.org #loops


5
कृपया समझाएँ। केवल एक कोड स्निपेट प्रदान करना पर्याप्त नहीं है। स्टैकओवरफ़्लो एक "गिम्मी द कोडेज़" साइट नहीं है, विचार यह है कि यदि उत्तर अमूर्त अवधारणा का स्पष्टीकरण प्रदान करता है तो दूसरों को अधिक लाभ होगा।
एलिरन मलका

1

आपके सम्मेलन के साथ, गिरफ्तारी एक सरणी है, लेकिन "फू" इस सरणी की एक संपत्ति है, यह अनुक्रमित मूल्य नहीं है। यदि आप अपने डेटा को किसी सरणी के अनुक्रमित मूल्यों को संग्रहीत करना चाहते हैं, तो आपको लिखना चाहिए:

arr1 = []
arr1[0] = "Bar"
arr1[1] = "Foo"

या यदि आप एक सहयोगी सरणी चाहते हैं, तो बस एक वस्तु का उपयोग करें:

arr2 = {}
arr2["Foo"] = "Bar" // equivalent to arr2.foo="Bar"
arr2["bar"] = "Foo" // equivalent to arr2.bar="Foo"

यदि आप arr1 पर लूप करना चाहते हैं:

str = "values are : "
for val in arr2
  str += val + " |"
console.log key + ': ' + val

रिटर्न:

values are : Bar | Foo |

और arr2 पर लूप करने के लिए: "सरणी में मान के लिए"

for key, val of arr
  console.log key + ': ' + val

कौन सा रिटर्न:

Foo : Bar
Bar : Foo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.