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

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

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

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
]

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

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

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 ':'.


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.


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.