Definieren eines Arrays anonymer Objekte in CoffeeScript


105

Wie definiere ich ein Array anonymer Objekte in CoffeeScript? Ist dies mit der YAML-Syntax überhaupt möglich?

Ich weiß, dass es ziemlich einfach ist, ein Array benannter Objekte zu haben:

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

Es wäre jedoch etwas schwieriger, wenn diese beiden Objekte keine Namen hätten

Antworten:


28

du kannst nicht:

Das sind einige Tricks:

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

Ein weiterer

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

das ist das beste:

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

6
Ist das nicht so hässlich :( Coffeescript ist wirklich gut für seine einrückungsbasierte Codierung, aber für große Objektliterale ist es nicht viel besser als Standard-JSON, da Sie alle Klammern ausbalancieren müssen und am Ende eine böse Suppe mit nachgestellten Klammern haben ein Ticket, um dieses Problem zu beheben und die YAML-Syntax zu verwenden, aber anscheinend gibt es in coffeescript eine Unklarheit beim Parsen, um dieses Problem zu lösen, was unglücklich ist.
bradgonesurfing

Anstelle von "true &&" können Sie natürlich auch das Äquivalent "yes and" oder "no or" verwenden. "ja und" macht hier sogar irgendwie Sinn.
Jameson Quinn

18
Schauen Sie sich meine Antwort an - dies ist perfekt ohne Tricks oder Klammern möglich.
Michael Hays

301

Einfach - Platzieren Sie ein Komma in einer Spalte, die niedriger ist als die, in der Sie Ihre Objekte definieren.

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

Wird werden:

var a;

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

1
weil es eine seltsam aussehende Lösung ist und die Kommas leicht übersehen werden
Eddie Monge Jr

Das ist gefährlich!! Manchmal erhalten Sie nur ein Array mit dem letzten Element! Siehe mein Beispiel unten ..
Dean Radcliffe

1
@DeanRadcliffe Es wird das letzte Element im Array zurückgegeben, wenn Sie das Komma nicht richtig setzen, ja, aber basiert CoffeeScript nicht auf der Prämisse der Konvention über syntaktischen Zucker?
Dubilla

Ich würde die Öffnung [links von der nächsten Zeile
einrücken

4
Ich denke, dass Coffeescript, anstatt eine Vereinfachung und Verbesserung gegenüber Vanille zu sein, viel mehr unnötige Komplikationen verursacht. Würde gerne einfach nur .js mit Schienenintegration verwenden, ohne Kaffee zu benötigen.
LasagneAndroid

40

Sie können zwischen jedem Objekt auch ein Koma einfügen: 

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

14

Ich denke, die Komma-Lösung ist besser, aber ich dachte, ich würde dies der Vollständigkeit halber hinzufügen:

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

Ich denke, das ist viel besser als die Komma-Lösung, bei der man bei der Platzierung von Kommas vorsichtig sein muss.
Nima

3

Sie können Variablen definieren, während Sie das Array definieren. Eine hässliche Antwort wäre also:

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

Es würde funktionieren, aber Sie erhalten möglicherweise Warnungen zu "definierten, aber nicht verwendeten Variablen (Element1, Element2)". Besser wäre es, einen Unterstrich zu verwenden, eine Variable, die verwendet wird, um nicht verwendete Variablen wegzulassen:

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

console.log JSON.stringify(a) wird dies produzieren:

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

1

Keine Antwort auf die Frage des OP, aber nur für den Fall, dass Sie aus dem gleichen Grund wie ich hier sind ... Wenn Sie nur noch wenig Mountain Dew haben und '=' anstelle von ':' verwenden, wird Coffeescript Ihr Array umdrehen von Objekten in ein flaches Array ohne Kompilierungsfehler:

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

Produziert

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

Fügen Sie mehr Gebirgstau ein und ersetzen Sie das '=' durch ':'.


2
wtf hat bergtau damit zu tun?
5.

1

Ich freue mich sehr, nach einigem Hin und Her berichten zu können, dass ich dies genau richtig kompilieren kann:

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

Das Ergebnis ist genau das, was Sie erwarten: eine Liste von zwei anonymen Objekten.


0

Ich bin auf ein ähnliches Problem gestoßen und habe diese Lösung gefunden. Wenn Sie ein Array mit vielen einzelnen k / v-Objekten ohne geschweifte Klammern wünschen, rücken Sie einfach einige davon ein. Scheint den Trick zu machen.

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       
]                                            

Produziert:

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 } ]

Es ist für mich nicht intuitiv; Sie würden denken, dass dies Unterobjekte erzeugen würde, aber ich denke, das Komma am Ende der Zeile sagt ihm, dass es aufhören soll, Eigenschaften für dieses Objekt zu erstellen.


Während dies funktioniert, vermute ich, dass es ein Nebeneffekt davon ist, wie die Linien analysiert werden. Da aufeinanderfolgende Zeilen nicht denselben Einzug haben, können sie nicht in dasselbe Objekt eingefügt werden. Anstatt einen Syntaxfehler auszulösen, wird anscheinend ein neues Objekt gestartet. Es ist eine Funktion, auf die man wahrscheinlich nicht zählen sollte - es sei denn, Sie finden sie dokumentiert.
hpaulj

@hpaulj gut, wenn Sie einen besseren Weg haben, dies zu tun, bin ich ganz Ohr
jcollum

1
Schon seit Python meine 'Muttersprache' ist, habe ich keine Angst, ein paar zusätzliche Klammern und Klammern zu verwenden. Auch wenn Coffeescript sie nicht benötigt, finde ich sie hilfreich. Ihr zweiter Block ist besser lesbar.
hpaulj

0

Warum nicht:

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

Es ist immer noch eine enorme Verbesserung für mich gegenüber js, sehr einfach zu lesen, minimal und ziemlich sicher zu schreiben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.