Definiowanie tablicy anonimowych obiektów w CoffeeScript

105

Jak zdefiniować tablicę anonimowych obiektów w CoffeeScript? Czy jest to w ogóle możliwe przy użyciu składni YAML?

Wiem, że posiadanie tablicy nazwanych obiektów jest dość łatwe:

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

Jednak byłoby nieco trudniej, gdyby te dwa obiekty nie miały nazw

Preslav Rachev
źródło

Odpowiedzi:

28

nie możesz:

to jest kilka sztuczek:

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

inne

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

to jest najlepszy:

items:[
    {name:"value1"}
    {name:"value2"}
]
wyspa205
źródło
6
Czy to nie takie brzydkie :( Coffeescript jest naprawdę fajny ze względu na kodowanie oparte na wcięciach, ale w przypadku dużych literałów obiektowych nie jest dużo lepszy niż standardowy JSON, ponieważ musisz zrównoważyć wszystkie nawiasy, a kończy się paskudną zupą z nawiasami końcowymi. bilet do rozwiązania tego problemu i użycia składni YAML, ale najwyraźniej jest analizowana niejednoznaczność w skrypcie, aby rozwiązać ten problem, co jest niefortunne.
bradgonesurfing Kwietnia
Zamiast „prawda &&” możesz oczywiście użyć odpowiednika „tak i” lub „nie lub”. „tak i” nawet w pewnym sensie ma tutaj sens.
Jameson Quinn
18
Sprawdź moją odpowiedź - jest to całkowicie wykonalne bez żadnych sztuczek i szelek.
Michael Hays
301

Prosty - umieść sam przecinek w kolumnie niższej niż ta, w której definiujesz swoje obiekty.

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

Stanie się:

var a;

a = [
  {
    nameA1: valueA1,
    nameA2: valueA2,
    nameA3: valueA3
  }, {
    nameB1: valueB1,
    nameB2: valueB2,
    nameB3: valueB3
  }
];
Michael Hays
źródło
1
ponieważ jest to dziwnie wyglądające rozwiązanie, a przecinki łatwo przeoczyć
Eddie Monge Jr
To jest niebezpieczne!! Czasami podaje tylko tablicę z ostatnim elementem! Zobacz mój przykład poniżej ..
Dean Radcliffe
1
@DeanRadcliffe Zwróci ostatni element w tablicy, jeśli nie umieścisz poprawnie przecinka, tak, ale czy CoffeeScript nie jest zbudowany na założeniu konwencji zamiast cukru składniowego?
dubilla
[
Wcięłbym
4
Myślę, że coffeescript, zamiast być uproszczeniem i ulepszeniem w stosunku do wanilii, generuje o wiele więcej niepotrzebnych komplikacji. Chciałbym użyć zwykłego pliku .js z integracją z szynami bez potrzeby picia kawy.
LasagnaAndroid
40

Możesz także dodać przecinek między każdym obiektem: 

items:[
    item1:
        name1:value1
  ,
    item2:
        name:value2
]
artur
źródło
14

Myślę, że rozwiązanie z przecinkiem jest lepsze, ale pomyślałem, że dodam to dla kompletności:

a = [
  {
    nameA1: valueA1
    nameA2: valueA2
    nameA3: valueA3
  }
  {
    nameB1: valueB1
    nameB2: valueB2
    nameB3: valueB3
  }
]
Evan Moran
źródło
Myślę, że jest to znacznie lepsze niż rozwiązanie z przecinkiem, w którym musisz uważać na umieszczanie przecinków.
nima
3

Możesz zdefiniować zmienną podczas definiowania tablicy, więc brzydka odpowiedź byłaby:

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

To zadziała, ale możesz otrzymać ostrzeżenia o „zdefiniowanych, ale nieużywanych zmiennych (element1, element2)”. Lepszym sposobem byłoby użycie podkreślenia, zmiennej służącej do pominięcia nieużywanych zmiennych:

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

console.log JSON.stringify(a) wyprodukuje to:

  {
    "items":[
      {
        "name":"value1"
      },{
        "name":"value2"
      }
    ]
  }
remiq
źródło
1

Nie jest to odpowiedź na pytanie OP, ale na wypadek, gdybyś tu był z tego samego powodu co ja ... Jeśli masz mało Mountain Dew i użyj '=' zamiast ':', Coffeescript zmieni twoją tablicę obiektów w płaską tablicę bez błędu kompilacji:

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

Produkuje

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

Wstaw więcej Mountain Dew i zamień „=” na „:”.

Seth
źródło
2
wtf czy górska rosa ma z tym coś wspólnego?
wyzwolony
1

Bardzo się cieszę, że po krótkiej zabawie mogę zgłosić, że mogłem to skompilować:

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

Z tego wynika dokładnie to, czego można się spodziewać: lista dwóch anonimowych obiektów.

Prathan Thananart
źródło
0

Napotkałem powiązany problem i znalazłem to rozwiązanie. Jeśli chcesz mieć tablicę wielu pojedynczych obiektów k / v bez nawiasów klamrowych, po prostu wprowadź wcięcie do niektórych z nich. Wydaje się, że to załatwia sprawę.

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       
]                                            

Produkuje:

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

Jest to dla mnie sprzeczne z intuicją; można by pomyśleć, że spowodowałoby to utworzenie podobiektów, ale myślę, że przecinek na końcu wiersza mówi mu, aby przestał tworzyć właściwości tego obiektu.

jcollum
źródło
Chociaż to działa, podejrzewam, że jest to efekt uboczny analizowania linii. Ponieważ kolejne wiersze nie mają tego samego wcięcia, nie można ich umieścić w tym samym obiekcie. Najwyraźniej zamiast zgłosić błąd składniowy, uruchamia nowy obiekt. Jest to funkcja, na którą prawdopodobnie nie należy liczyć - chyba że możesz ją udokumentować.
hpaulj
@hpaulj cóż, jeśli masz lepszy sposób na zrobienie tego, jestem wszystkimi uszami
jcollum
1
Ponieważ Pythonjest to mój „pierwszy język”, nie boję się użyć kilku dodatkowych nawiasów i nawiasów klamrowych. Nawet jeśli Coffeescript ich nie potrzebuje, uważam, że są pomocne. Twój drugi blok jest bardziej czytelny.
hpaulj
0

Dlaczego nie:

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

Wciąż jest to dla mnie ogromna poprawa w porównaniu z js, bardzo łatwa do odczytania, minimalna i całkiem bezpieczna do napisania.

erandros
źródło