Definición de una matriz de objetos anónimos en CoffeeScript

105

¿Cómo defino una matriz de objetos anónimos en CoffeeScript? ¿Es esto posible en absoluto, usando la sintaxis YAML?

Sé que tener una matriz de objetos con nombre es bastante fácil:

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

Sin embargo, sería un poco más complicado si esos dos objetos no tuvieran nombres

Preslav Rachev
fuente

Respuestas:

28

no puedes:

estos son algunos trucos:

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

otro

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

esto es lo mejor:

items:[
    {name:"value1"}
    {name:"value2"}
]
island205
fuente
6
¿No es tan feo ?:( Coffeescript es realmente bueno por su codificación basada en sangría, pero para objetos literales grandes no es mucho mejor que JSON estándar, ya que tienes que equilibrar todos los corchetes y terminas con una desagradable sopa de corchetes finales. un ticket para resolver esto y usar la sintaxis YAML, pero aparentemente hay ambigüedad de análisis en coffeescript para resolver esto, lo cual es desafortunado.
bradgonesurfing
En lugar de "verdadero &&", por supuesto, podría utilizar el equivalente "sí y" o "no o". "sí y" incluso tiene sentido aquí.
Jameson Quinn
18
Mira mi respuesta: esto es perfectamente factible sin trucos ni llaves.
Michael Hays
301

Simple: coloque una coma sola en una columna más baja que aquella en la que define sus objetos.

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

Se convertirá:

var a;

a = [
  {
    nameA1: valueA1,
    nameA2: valueA2,
    nameA3: valueA3
  }, {
    nameB1: valueB1,
    nameB2: valueB2,
    nameB3: valueB3
  }
];
Michael Hays
fuente
1
porque es una solución de apariencia extraña y las comas se pasan por alto fácilmente
Eddie Monge Jr
¡¡Esto es peligroso!! ¡A veces solo te da una matriz con el último elemento! Vea mi ejemplo a continuación ..
Dean Radcliffe
1
@DeanRadcliffe Devolverá el último elemento de la matriz si no coloca la coma correctamente, sí, pero ¿CoffeeScript no se basa en la premisa de la convención sobre el azúcar sintáctico?
dubilla
Sangraría la apertura [a la izquierda de la siguiente línea, ya es bastante confuso ...
matanster
4
Creo que coffeescript, en lugar de ser una simplificación y mejora sobre vainilla, genera muchas más complicaciones innecesarias. Me encantaría usar simplemente .js simple con integración de rieles sin la necesidad de café.
LasagnaAndroid
40

También puede agregar una coma entre cada objeto: 

items:[
    item1:
        name1:value1
  ,
    item2:
        name:value2
]
Arturo
fuente
14

Creo que la solución de coma es mejor, pero pensé que agregaría esto para completar:

a = [
  {
    nameA1: valueA1
    nameA2: valueA2
    nameA3: valueA3
  }
  {
    nameB1: valueB1
    nameB2: valueB2
    nameB3: valueB3
  }
]
Evan Moran
fuente
Creo que esto es mucho mejor que la solución de coma, donde hay que tener cuidado con la colocación de las comas.
nima
3

Puede definir la variable mientras define la matriz, por lo que una respuesta desagradable sería:

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

Funcionaría, pero es posible que reciba advertencias sobre "variables definidas, pero no utilizadas (elemento1, elemento2)". Una mejor manera sería usar un guión bajo, variable usada para omitir variables no usadas:

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

console.log JSON.stringify(a) producirá esto:

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

No es una respuesta a la pregunta del OP, pero en caso de que esté aquí por la misma razón que yo ... Si tiene poca cantidad de Mountain Dew y usa '=' en lugar de ':', entonces Coffeescript convertirá su matriz de objetos en una matriz plana sin un error de compilación:

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

Produce

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

Inserte más Mountain Dew y reemplace el '=' con ':'.

Seth
fuente
2
¿Qué tiene que ver el rocío de la montaña con esto?
fent de
1

Estoy muy feliz de informar después de un poco de manipulación que podría hacer que esto se compilara correctamente:

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

El resultado es exactamente lo que cabría esperar: una lista de dos objetos anónimos.

Prathan Thananart
fuente
0

Me encontré con un problema relacionado y encontré esta solución. Si desea una matriz de muchos objetos k / v individuales sin llaves, simplemente sangra algunos de ellos. 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       
]                                            

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

Es contrario a la intuición para mí; pensarías que esto haría subobjetos, pero creo que la coma al final de la línea le dice que deje de hacer propiedades en ese objeto.

jcollum
fuente
Si bien esto funciona, sospecho que es un efecto secundario de cómo se analizan las líneas. Dado que las líneas sucesivas no tienen la misma sangría, no puede colocarlas en el mismo objeto. Aparentemente, en lugar de generar un error de sintaxis, inicia un nuevo objeto. Es una característica con la que probablemente no se debería contar, a menos que pueda encontrarla documentada.
hpaulj
@hpaulj bueno, si tienes una mejor manera de hacer esto, soy todo oídos
jcollum
1
Dado que Pythones mi "primer idioma", no tengo miedo de usar algunos corchetes y llaves adicionales. Incluso si Coffeescript no los necesita, los encuentro útiles. Su segundo bloque es más legible.
hpaulj
0

Por qué no:

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

Sigue siendo una gran mejora para mí con respecto a js, muy fácil de leer, mínimo y bastante seguro de escribir.

erandros
fuente