Définition d'un tableau d'objets anonymes dans CoffeeScript

105

Comment définir un tableau d'objets anonymes dans CoffeeScript? Est-ce possible du tout, en utilisant la syntaxe YAML?

Je sais qu'avoir un tableau d'objets nommés est assez simple:

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

Cependant, ce serait un peu plus compliqué, si ces deux objets n'avaient pas de noms

Preslav Rachev
la source

Réponses:

28

vous ne pouvez pas:

voici quelques astuces:

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

un autre

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

c'est le meilleur:

items:[
    {name:"value1"}
    {name:"value2"}
]
île205
la source
6
N'est-ce pas si moche? un ticket pour résoudre cela et utiliser la syntaxe YAML, mais apparemment, il y a une ambiguïté d'analyse dans coffeescript pour résoudre ce problème, ce qui est malheureux.
bradgonesurfing
Au lieu de "vrai &&", vous pouvez bien sûr utiliser l'équivalent "oui et" ou "non ou". «oui et» même un peu de sens ici.
Jameson Quinn
18
Découvrez ma réponse - c'est parfaitement faisable sans astuces ni accolades.
Michael Hays
301

Simple - placez une virgule seule dans une colonne inférieure à celle dans laquelle vous définissez vos objets.

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

Va devenir:

var a;

a = [
  {
    nameA1: valueA1,
    nameA2: valueA2,
    nameA3: valueA3
  }, {
    nameB1: valueB1,
    nameB2: valueB2,
    nameB3: valueB3
  }
];
Michael Hays
la source
1
parce que c'est une solution étrange et les virgules sont facilement manquées
Eddie Monge Jr
C'est dangereux!! Parfois, ne vous donne qu'un tableau avec le dernier élément! Voir mon exemple ci-dessous ..
Dean Radcliffe
1
@DeanRadcliffe Il renverra le dernier élément du tableau si vous ne placez pas la virgule correctement, oui, mais CoffeeScript n'est-il pas construit sur le principe de la convention sur le sucre syntaxique?
dubilla
Je mettrais en retrait l'ouverture [à gauche de la ligne suivante, c'est assez déroutant tel
quel
4
Je pense que coffeescript, au lieu d'être une simplification et une amélioration par rapport à la vanille, génère beaucoup plus de complications inutiles. J'adorerais utiliser simplement .js avec intégration de rails sans avoir besoin de café.
LasagnaAndroid
40

Vous pouvez également ajouter une virgule entre chaque objet: 

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

Je pense que la solution par virgule est meilleure, mais j'ai pensé que j'ajouterais ceci pour être complet:

a = [
  {
    nameA1: valueA1
    nameA2: valueA2
    nameA3: valueA3
  }
  {
    nameB1: valueB1
    nameB2: valueB2
    nameB3: valueB3
  }
]
Evan Moran
la source
Je pense que c'est bien mieux que la solution virgule, où vous devez faire attention au placement des virgules.
nima le
3

Vous pouvez définir une variable lors de la définition du tableau, donc une réponse laide serait:

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

Cela fonctionnerait, mais vous pourriez recevoir des avertissements concernant "les variables définies, mais non utilisées (item1, item2)". La meilleure façon serait d'utiliser le trait de soulignement, variable utilisée pour omettre les variables non utilisées:

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

console.log JSON.stringify(a) produira ceci:

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

Ce n'est pas une réponse à la question de l'OP, mais juste au cas où vous seriez ici pour la même raison que moi ... Si vous êtes à court de Mountain Dew et utilisez '=' au lieu de ':', alors Coffeescript transformera votre tableau d'objets dans un tableau plat sans erreur de compilation:

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

Produit

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

Insérez plus de Mountain Dew et remplacez le '=' par ':'.

Seth
la source
2
Qu'est-ce que la rosée des montagnes a à voir avec cela?
fent
1

Je suis très heureux d'annoncer après un peu de bidouillage que je pourrais obtenir ceci pour compiler juste correctement:

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

Il en résulte exactement ce à quoi vous vous attendez: une liste de deux objets anonymes.

Prathan Thananart
la source
0

J'ai rencontré un problème connexe et j'ai trouvé cette solution. Si vous voulez un tableau de plusieurs objets k / v simples sans accolades, indentez simplement certains d'entre eux. Semble faire l'affaire.

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       
]                                            

Produit:

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

C'est contre-intuitif pour moi; on pourrait penser que cela créerait des sous-objets, mais je pense que la virgule à la fin de la ligne lui dit d'arrêter de créer des propriétés sur cet objet.

jcollum
la source
Bien que cela fonctionne, je soupçonne que c'est un effet secondaire de la façon dont les lignes sont analysées. Puisque les lignes successives n'ont pas la même indentation, il ne peut pas les mettre dans le même objet. Apparemment, au lieu de déclencher une erreur de syntaxe, il démarre un nouvel objet. C'est une fonctionnalité sur laquelle il ne faut probablement pas compter - à moins que vous ne puissiez la trouver documentée.
hpaulj
@hpaulj bien si vous avez une meilleure façon de faire cela, je suis toutes les oreilles
jcollum
1
Puisque Pythonc'est ma «première langue», je n'ai pas peur d'utiliser quelques crochets et accolades supplémentaires. Même si Coffeescript n'en a pas besoin, je les trouve utiles. Votre deuxième bloc est plus lisible.
hpaulj
0

Pourquoi pas:

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

C'est toujours une énorme amélioration pour moi par rapport à js, très facile à lire, minimal et assez sûr à écrire.

Erandros
la source