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

Preslav Rachev
quelle

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"}
]
Insel205
quelle
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
  }
];
Michael Hays
quelle
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
]
Arthur
quelle
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
  }
]
Evan Moran
quelle
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"
      }
    ]
  }
remiq
quelle
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 ':'.

Seth
quelle
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.

Prathan Thananart
quelle
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.

jcollum
quelle
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.

Erandros
quelle