कॉफीस्क्रिप्ट में अनाम वस्तुओं की एक सरणी को परिभाषित करना


105

मैं कॉफीस्क्रिप्ट में अनाम वस्तुओं की एक सरणी को कैसे परिभाषित करूं? यह सब संभव है, YAML सिंटैक्स का उपयोग करके?

मुझे पता है कि नामित वस्तुओं का एक सरणी होना काफी आसान है:

items:[
   item1:
      name1:value1
   item2:
      name:value2
]

हालांकि, यह थोड़ा पेचीदा होगा, अगर उन दो वस्तुओं का कोई नाम नहीं था

जवाबों:


28

आप नहीं कर सकते:

यह कुछ ट्रिक्स हैं:

items:[
    (name:"value1")
    (name:"value2")
]

एक और

items:[
    true && name:"value1"
    true && name:"value2"
]

यह सबसे अच्छा है:

items:[
    {name:"value1"}
    {name:"value2"}
]

6
क्या यह इतना बदसूरत नहीं है :( कॉफ़ीस्क्रिप्ट वास्तव में इंडेंट आधारित कोडिंग के लिए अच्छा है, लेकिन बड़े ऑब्जेक्ट शाब्दिकों के लिए यह मानक JSON से बहुत बेहतर नहीं है क्योंकि आपको सभी कोष्ठक को संतुलित करना होगा और आप बुरा अनुगामी कोष्ठक सूप के साथ समाप्त कर सकते हैं। इसे हल करने के लिए एक टिकट और YAML सिंटैक्स का उपयोग करें, लेकिन जाहिरा तौर पर इसे हल करने के लिए कॉफ़ीसेप्ट में अस्पष्टता पार्सिंग है जो कि दुर्भाग्यपूर्ण है।
bradgonesurfing

"सच और&" के बजाय आप निश्चित रूप से समकक्ष "हाँ और" या "नहीं या" का उपयोग कर सकते हैं। "हाँ और" यहाँ भी समझ में आता है।
जेम्सन क्विन

18
मेरे उत्तर की जाँच करें - यह पूरी तरह से बिना किसी चाल या ब्रेसिज़ के संभव है।
माइकल हेक

301

सिंपल - एक कॉमा को अपने आप से कम एक कॉलम में रखें, जिसमें आप अपनी वस्तुओं को परिभाषित करते हैं।

a = [
     nameA1: valueA1
     nameA2: valueA2
     nameA3: valueA3
  ,
     nameB1: valueB1
     nameB2: valueB2
     nameB3: valueB3
]

हो जाएगा:

var a;

a = [
  {
    nameA1: valueA1,
    nameA2: valueA2,
    nameA3: valueA3
  }, {
    nameB1: valueB1,
    nameB2: valueB2,
    nameB3: valueB3
  }
];

1
क्योंकि इसका एक अजीब लग समाधान और अल्पविराम आसानी से याद कर रहे हैं
एडी मेन्ज जूनियर

यह खतरनाक है!! कभी-कभी केवल आपको अंतिम आइटम के साथ एक सरणी देता है! नीचे मेरा उदाहरण देखें ..
डीन रेडक्लिफ

1
@DeanRadcliffe यदि आप अल्पविराम को ठीक से नहीं रखते हैं, तो यह सरणी में अंतिम आइटम वापस कर देगा, हाँ, लेकिन सिंटैक्टिकल चीनी पर अधिवेशन के आधार पर CoffeeScript नहीं बनाया गया है?
डबिला

मैं [अगली पंक्ति के बाईं ओर खुलने के लिए
प्रेरित करूंगा

4
मुझे लगता है कि कॉफ़िशस्क्रिप्ट, वेनिला पर एक सरलीकरण और सुधार के बजाय बहुत अधिक अनावश्यक जटिलताओं को उत्पन्न करता है। कॉफी की आवश्यकता के बिना रेल एकीकरण के साथ बस सादे .js का उपयोग करना पसंद करेंगे।
LasagnaAndroid

40

आप प्रत्येक ऑब्जेक्ट के बीच कोमा भी जोड़ सकते हैं: 

items:[
    item1:
        name1:value1
  ,
    item2:
        name:value2
]

14

मुझे लगता है कि अल्पविराम समाधान बेहतर है, लेकिन मुझे लगा कि मैं इसे पूर्णता के लिए जोड़ूंगा:

a = [
  {
    nameA1: valueA1
    nameA2: valueA2
    nameA3: valueA3
  }
  {
    nameB1: valueB1
    nameB2: valueB2
    nameB3: valueB3
  }
]

मुझे लगता है कि यह अल्पविराम समाधान से बहुत बेहतर है, जहाँ आपको अल्पविराम लगाने से सावधान रहना होगा।
नीमा

3

आप सरणी को परिभाषित करते समय चर को परिभाषित कर सकते हैं, इसलिए एक बदसूरत उत्तर होगा:

a = 
  items: [
    item1 = 
      name: 'value1'
    item2 = 
      name: 'value2'
  ]

यह काम करेगा, लेकिन आपको "परिभाषित, लेकिन उपयोग किए गए चर (आइटम 1, आइटम 2)" के बारे में चेतावनी नहीं मिल सकती है। बेहतर तरीका यह होगा कि अंडरस्कोर का उपयोग किया जाए, चर का उपयोग न करने के लिए इस्तेमाल किया जाने वाला चर:

a = 
  items: [
    _ = 
      name: 'value1'
    _ = 
      name: 'value2'
  ]

console.log JSON.stringify(a) इसका उत्पादन करेंगे:

  {
    "items":[
      {
        "name":"value1"
      },{
        "name":"value2"
      }
    ]
  }

1

ओपी के सवाल का जवाब नहीं है, लेकिन सिर्फ इस मामले में कि आप यहाँ उसी कारण से हैं, यदि आप ... यदि आप माउंटेन ड्यू पर कम हैं और '=' के बजाय '=' का उपयोग करते हैं, तो कॉफ़ीस्क्रिप्ट आपकी सारणी को बदल देगा। संकलित त्रुटि के बिना एक फ्लैट सरणी में वस्तुओं का:

data = [
    one='one'
    two='two'
  ,
    one='1'
    two='2'
]

का उत्पादन

['one', 'two', '1', '2']

अधिक माउंटेन ड्यू डालें और '=' को ':' से बदलें।


2
wtf को पहाड़ी ओस का इससे क्या लेना-देना है?
fent

1

मुझे यह जानकर बहुत खुशी हुई कि थोड़ी सी फ़िदालिंग के बाद मैं इसे सही संकलन के लिए प्राप्त कर सका:

items: [
  nameA: subA
  nameB: subB
,
  nameX: subX
  nameY: subY
]

यह वही करता है जो आप चाहते हैं: दो अनाम वस्तुओं की सूची।


0

मैं एक संबंधित समस्या में भाग गया और इस समाधान को पाया। यदि आप ब्रेसिज़ के बिना कई एकल k / v वस्तुओं की एक सरणी चाहते हैं, तो बस उनमें से कुछ को इंडेंट करें। चालबाजी करने लगता है।

data = [                                     
  "2013-09-25T16:46:52.636Z":3,              
    "2013-09-25T16:47:52.636Z":6,            
      "2013-09-25T16:48:52.636Z":2,          
        "2013-09-25T16:49:52.636Z":7,        
  "2013-09-25T16:50:52.636Z":5,              
    "2013-09-25T16:51:52.636Z":2,            
      "2013-09-25T16:52:52.636Z":1,          
        "2013-09-25T16:53:52.636Z":3,        
  "2013-09-25T16:54:52.636Z":8,              
    "2013-09-25T16:55:52.636Z":9,            
      "2013-09-25T16:56:52.636Z":2,          
        "2013-09-25T16:57:52.636Z":5,        
          "2013-09-25T16:58:52.636Z":7       
]                                            

पैदा करता है:

coffee> data
[ { '2013-09-25T16:46:52.636Z': 3 },
  { '2013-09-25T16:47:52.636Z': 6 },
  { '2013-09-25T16:48:52.636Z': 2 },
  { '2013-09-25T16:49:52.636Z': 7 },
  { '2013-09-25T16:50:52.636Z': 5 },
  { '2013-09-25T16:51:52.636Z': 2 },
  { '2013-09-25T16:52:52.636Z': 1 },
  { '2013-09-25T16:53:52.636Z': 3 },
  { '2013-09-25T16:54:52.636Z': 8 },
  { '2013-09-25T16:55:52.636Z': 9 },
  { '2013-09-25T16:56:52.636Z': 2 },
  { '2013-09-25T16:57:52.636Z': 5 },
  { '2013-09-25T16:58:52.636Z': 7 } ]

यह मेरे लिए प्रति-सहज है; आपको लगता है कि यह सब-ऑब्जेक्ट बना देगा, लेकिन मुझे लगता है कि लाइन के अंत में अल्पविराम उस वस्तु पर गुण बनाना बंद करने के लिए कहता है।


जब यह काम करता है, मुझे संदेह है कि यह एक साइड इफेक्ट है कि लाइनों को कैसे पार्स किया जाता है। चूँकि क्रमिक लाइनों में एक ही इंडेंटेशन नहीं है, इसलिए यह उन्हें एक ही ऑब्जेक्ट में नहीं डाल सकता है। जाहिर है, एक वाक्यविन्यास त्रुटि को बढ़ाने के बजाय, यह एक नई वस्तु शुरू करता है। यह एक ऐसी विशेषता है जिसे शायद तब तक नहीं गिना जाना चाहिए - जब तक कि आप इसे प्रलेखित नहीं कर सकते।
हापुलज

@ अंपुलज ने कहा कि अगर आपको यह करने का एक बेहतर तरीका मिल गया है तो मैं सभी कानों के लिए हूं
jcollum

1
चूंकि Pythonमेरी 'पहली भाषा' है, इसलिए मैं कुछ अतिरिक्त कोष्ठक और ब्रेसिज़ का उपयोग करने से नहीं डरता। भले ही कॉफ़ीस्क्रिप्ट को उनकी आवश्यकता नहीं है, मैं उन्हें मददगार मानता हूं। आपका दूसरा ब्लॉक अधिक पठनीय है।
हंपुलज

0

क्यों नहीं:

list = []
list.push
  prop1: val
  prop2: val
list.push
  prop1: val
  prop2: val

यह अभी भी js पर मेरे लिए बहुत बड़ा सुधार है, पढ़ने में बहुत आसान है, लिखने के लिए न्यूनतम और बहुत ही सुरक्षित है।

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