Definizione di un array di oggetti anonimi in CoffeeScript


105

Come si definisce un array di oggetti anonimi in CoffeeScript? È possibile questo, usando la sintassi YAML?

So che avere un array di oggetti con nome è abbastanza semplice:

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

Tuttavia, sarebbe un po 'più complicato se quei due oggetti non avessero nomi

Risposte:


28

non puoi:

questi sono alcuni trucchi:

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

un altro

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

questo è il migliore:

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

6
Non è così brutto :( Coffeescript è davvero carino per la sua codifica basata sui rientri, ma per i letterali oggetto di grandi dimensioni non è molto meglio del JSON standard poiché devi bilanciare tutte le parentesi e ti ritroverai con una brutta zuppa di parentesi finale. un ticket per risolvere questo problema e utilizzare la sintassi YAML ma a quanto pare c'è un'ambiguità di analisi in coffeescript per risolvere questo problema, il che è sfortunato.
bradgonesurfing

Invece di "vero &&" potresti ovviamente usare l'equivalente "sì e" o "no o". "sì e" anche un po 'ha senso qui.
Jameson Quinn

18
Dai un'occhiata alla mia risposta: questo è perfettamente fattibile senza trucchi o parentesi graffe.
Michael Hays

301

Semplice: inserisci una virgola da sola in una colonna inferiore a quella in cui definisci i tuoi oggetti.

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

Diventerà:

var a;

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

1
perché è una soluzione dall'aspetto strano e le virgole si perdono facilmente
Eddie Monge Jr

Questo è pericoloso!! A volte ti dà solo un array con l'ultimo elemento! Vedi il mio esempio qui sotto ..
Dean Radcliffe

1
@DeanRadcliffe Restituirà l'ultimo elemento nell'array se non inserisci correttamente la virgola, sì, ma CoffeeScript non è costruito sulla premessa della convenzione sullo zucchero sintattico?
dubilla

Vorrei far rientrare l'apertura [a sinistra della riga successiva, è abbastanza confuso così com'è ..
matanster

4
Penso che coffeescript, invece di essere una semplificazione e un miglioramento rispetto alla vaniglia, generi molte più complicazioni inutili. Mi piacerebbe usare solo .js semplice con l'integrazione di binari senza la necessità di caffè.
LasagnaAndroid

40

Puoi anche aggiungere una virgola tra ogni oggetto: 

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

14

Penso che la soluzione con la virgola sia migliore, ma ho pensato di aggiungerla per completezza:

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

Penso che sia molto meglio della soluzione virgola, in cui devi stare attento con il posizionamento della virgola.
nima

3

Puoi definire la variabile mentre definisci l'array, quindi una brutta risposta sarebbe:

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

Funzionerebbe, ma potresti ricevere avvisi su "variabili definite, ma non utilizzate (elemento1, elemento2)". Il modo migliore sarebbe usare il carattere di sottolineatura, variabile usata per omettere le variabili non utilizzate:

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

console.log JSON.stringify(a) produrrà questo:

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

1

Non una risposta alla domanda dell'OP, ma nel caso tu fossi qui per lo stesso motivo per cui ero io ... Se sei a corto di Mountain Dew e usi '=' invece di ':', Coffeescript cambierà il tuo array di oggetti in un array piatto senza un errore di compilazione:

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

produce

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

Inserisci più Mountain Dew e sostituisci "=" con ":".


2
che cosa c'entra la rugiada di montagna?
fent

1

Sono molto felice di segnalare dopo un po 'di giocherellare che sono riuscito a compilare correttamente:

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

Il risultato è proprio quello che ti aspetteresti: un elenco di due oggetti anonimi.


0

Mi sono imbattuto in un problema correlato e ho trovato questa soluzione. Se vuoi un array di molti oggetti k / v singoli senza parentesi graffe, indentane solo alcuni. Sembra fare il trucco.

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       
]                                            

produce:

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

È controintuitivo per me; penseresti che questo creerebbe sotto-oggetti ma penso che la virgola alla fine della riga gli dica di smettere di creare proprietà su quell'oggetto.


Sebbene funzioni, sospetto che sia un effetto collaterale del modo in cui vengono analizzate le linee. Poiché le righe successive non hanno lo stesso rientro, non è possibile inserirle nello stesso oggetto. Apparentemente, invece di generare un errore di sintassi, avvia un nuovo oggetto. È una funzionalità su cui probabilmente non si dovrebbe contare, a meno che non sia possibile trovarla documentata.
hpaulj

@hpaulj, beh, se hai un modo migliore per farlo, sono tutto orecchie
jcollum

1
Da Python è la mia "prima lingua", non ho paura di usare alcune parentesi e parentesi graffe extra. Anche se Coffeescript non ne ha bisogno, trovo che siano utili. Il tuo secondo blocco è più leggibile.
hpaulj

0

Perchè no:

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

È ancora un enorme miglioramento per me rispetto a js, molto facile da leggere, minimo e abbastanza sicuro da scrivere.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.