在CoffeeScript中定义一组匿名对象

时间:2012-01-27 05:52:30

标签: coffeescript

如何在CoffeeScript中定义匿名对象数组?这是否可行,使用YAML语法?

我知道拥有一组命名对象非常简单:

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

但是,如果这两个对象没有名称

,那将会有点棘手

8 个答案:

答案 0 :(得分:299)

简单 - 将逗号单独放在低于您定义对象的列中。

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

将成为:

var a;

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

答案 1 :(得分:40)

您还可以在每个对象之间添加逗号:

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

答案 2 :(得分:28)

你不能:

这是一些技巧:

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

另一个

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

这是最好的:

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

答案 3 :(得分:14)

我认为逗号解决方案更好,但我想我会为了完整性添加它:

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

答案 4 :(得分:3)

你可以在定义数组时定义变量,所以一个丑陋的答案是:

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

它会起作用,但您可能会收到有关“已定义但未使用的变量(item1,item2)”的警告。更好的方法是使用下划线,变量用于省略未使用的变量:

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

console.log JSON.stringify(a)会产生这个:

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

答案 5 :(得分:1)

不是OP的问题的答案,但是如果你出于同样的原因我就在这里...如果你在Mountain Dew上使用'='而不是':',那么Coffeescript将会将您的对象数组转换为平面数组而不会出现编译错误:

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

可生产

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

插入更多Mountain Dew并将'='替换为':'。

答案 6 :(得分:0)

我遇到了一个相关的问题并找到了这个解决方案。如果你想要一个没有大括号的许多单个k / v对象的数组,只需缩进其中一些。似乎可以做到这一点。

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       
]                                            

制作:

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

这对我来说是违反直觉的;你会认为这会产生子对象,但我认为该行末尾的逗号告诉它停止在该对象上创建属性。

答案 7 :(得分:0)

为什么不:

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

与js相比,这对我来说仍然是一个巨大的进步,非常易于阅读,最小并且很安全。