Definindo uma matriz de objetos anônimos em CoffeeScript

105

Como faço para definir uma matriz de objetos anônimos em CoffeeScript? Isso é possível, usando a sintaxe YAML?

Eu sei que ter uma matriz de objetos nomeados é muito fácil:

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

No entanto, seria um pouco mais complicado se esses dois objetos não tivessem nomes

Preslav Rachev
fonte

Respostas:

28

você não pode:

estes são alguns truques:

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

outro

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

isso é o melhor:

items:[
    {name:"value1"}
    {name:"value2"}
]
island205
fonte
6
Não é tão feio :( Coffeescript é muito bom para sua codificação baseada em indentação, mas para grandes literais de objeto não é muito melhor do que JSON padrão, pois você tem que equilibrar todos os colchetes e você acaba com uma sopa de colchetes à direita. um tíquete para resolver isso e usar a sintaxe YAML, mas aparentemente há ambigüidade de análise em coffeescript para resolver isso, o que é lamentável.
bradgonesurfing
Em vez de "true &&", é claro que você pode usar o equivalente "yes and" ou "no or". "sim e" até faz sentido aqui.
Jameson Quinn
18
Verifique minha resposta - isso é perfeitamente realizável sem truques ou chaves.
Michael Hays
301

Simples - coloque uma vírgula sozinha em uma coluna abaixo daquela em que você definiu seus objetos.

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

Se tornará:

var a;

a = [
  {
    nameA1: valueA1,
    nameA2: valueA2,
    nameA3: valueA3
  }, {
    nameB1: valueB1,
    nameB2: valueB2,
    nameB3: valueB3
  }
];
Michael Hays
fonte
1
porque é uma solução de aparência estranha e as vírgulas são facilmente perdidas
Eddie Monge Jr,
Isso é perigoso!! Às vezes, apenas fornece uma matriz com o último item! Veja meu exemplo abaixo ..
Dean Radcliffe
1
@DeanRadcliffe Ele retornará o último item no array se você não colocar a vírgula corretamente, sim, mas o CoffeeScript não foi construído na premissa da convenção sobre o açúcar sintático?
dubilla
Eu recuaria a abertura [à esquerda da próxima linha, é confuso o suficiente como está ..
matanster
4
Acho que o coffeescript, em vez de ser uma simplificação e um aprimoramento do vanilla, gera muito mais complicações desnecessárias. Adoraria usar .js simples com integração de trilhos sem a necessidade de café.
LasagnaAndroid
40

Você também pode adicionar um coma entre cada objeto: 

items:[
    item1:
        name1:value1
  ,
    item2:
        name:value2
]
Arthur
fonte
14

Acho que a solução da vírgula é melhor, mas achei melhor adicionar isto para completar:

a = [
  {
    nameA1: valueA1
    nameA2: valueA2
    nameA3: valueA3
  }
  {
    nameB1: valueB1
    nameB2: valueB2
    nameB3: valueB3
  }
]
Evan Moran
fonte
Eu acho isso muito melhor do que a solução da vírgula, onde você tem que ter cuidado com a colocação da vírgula.
nima,
3

Você pode definir a variável enquanto define a matriz, então uma resposta feia seria:

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

Funcionaria, mas você pode obter avisos sobre "variáveis ​​definidas, mas não usadas (item1, item2)". A melhor maneira seria usar o sublinhado, variável usada para omitir variáveis ​​não usadas:

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

console.log JSON.stringify(a) irá produzir isto:

  {
    "items":[
      {
        "name":"value1"
      },{
        "name":"value2"
      }
    ]
  }
remiq
fonte
1

Não é uma resposta à pergunta do OP, mas apenas no caso de você estar aqui pelo mesmo motivo que eu ... Se você estiver com pouco Mountain Dew e usar '=' em vez de ':', então o Coffeescript mudará seu array de objetos em uma matriz plana sem um erro de compilação:

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

Produz

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

Insira mais Mountain Dew e substitua '=' por ':'.

Seth
fonte
2
O que o orvalho da montanha tem a ver com isso?
fent
1

Estou muito feliz em relatar, depois de mexer um pouco, que consegui fazer isso compilar corretamente:

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

O resultado é exatamente o que você esperava: uma lista de dois objetos anônimos.

Prathan Thananart
fonte
0

Encontrei um problema relacionado e encontrei esta solução. Se você quiser uma matriz de muitos objetos k / v únicos sem colchetes, apenas indente alguns deles. Parece funcionar.

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       
]                                            

Produz:

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

É contra-intuitivo para mim; você pensaria que isso faria subobjetos, mas acho que a vírgula no final da linha diz para parar de fazer propriedades nesse objeto.

Jcollum
fonte
Embora isso funcione, suspeito que seja um efeito colateral de como as linhas são analisadas. Como as linhas sucessivas não têm o mesmo recuo, ele não pode colocá-las no mesmo objeto. Aparentemente, em vez de gerar um erro de sintaxe, ele inicia um novo objeto. É um recurso com o qual provavelmente não se deve contar - a menos que você possa encontrá-lo documentado.
hpaulj
@hpaulj bem, se você tem uma maneira melhor de fazer isso, sou todo ouvidos
jcollum
1
Como Pythoné minha 'primeira língua', não tenho medo de usar alguns colchetes extras. Mesmo que o Coffeescript não precise deles, considero-os úteis. Seu segundo bloco é mais legível.
hpaulj
0

Por que não:

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

Ainda é uma grande melhoria para mim em relação ao js, ​​muito fácil de ler, mínimo e muito seguro de escrever.

Erandros
fonte