在CoffeeScript中定义匿名对象数组

在CoffeeScript中定义匿名对象数组,coffeescript,Coffeescript,如何在CoffeeScript中定义匿名对象数组?使用YAML语法,这可能吗 我知道拥有命名对象数组非常容易: items:[ item1: name1:value1 item2: name:value2 ] 但是,如果这两个对象没有名称,则会有点棘手,您不能: 这是一些技巧: items:[ (name:"value1") (name:"value2") ] 另一个 items:[ true && name:"va

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

我知道拥有命名对象数组非常容易:

items:[
   item1:
      name1:value1
   item2:
      name:value2
]
但是,如果这两个对象没有名称,则会有点棘手,您不能:

这是一些技巧:

items:[
    (name:"value1")
    (name:"value2")
]
另一个

items:[
    true && name:"value1"
    true && name:"value2"
]
这是最好的:

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

还可以在每个对象之间添加昏迷:

items:[
    item1:
        name1:value1
  ,
    item2:
        name:value2
]
简单——将逗号放在比定义对象所在列低的列中

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

我认为逗号解决方案更好,但为了完整起见,我想我应该添加以下内容:

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

我遇到了一个相关的问题,找到了这个解决方案。如果想要一个由多个不带大括号的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 } ]

这对我来说是违反直觉的;您可能会认为这会生成子对象,但我认为行末尾的逗号告诉它停止在该对象上生成属性

这不是对OP的问题的回答,但以防万一你来这里的原因和我一样。。。如果您的Mountain Dew资源不足,并使用“=”而不是“:”,则Coffeescript会将对象数组转换为平面数组,而不会出现编译错误:

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

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

插入更多Mountain Dew,并将“=”替换为“:”。

您可以在定义数组时定义变量,因此难看的答案是:

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

我很高兴在稍作修改后报告,我可以将其正确编译:

items: [
  nameA: subA
  nameB: subB
,
  nameX: subX
  nameY: subY
]
它的结果正是您所期望的:两个匿名对象的列表。

为什么不:

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

与js相比,这对我来说仍然是一个巨大的进步,非常容易阅读,而且写起来非常安全。

这不是很难看吗:(Coffeescript非常适合基于缩进的编码,但对于大型对象文字,它并不比标准JSON好多少,因为你必须平衡所有括号,最终会得到令人讨厌的尾随括号。有一个解决方案,使用YAML语法,但显然Coffeescript中存在解析歧义来解决这个问题这是很不幸的。你当然可以用“是和”或“否或”来代替“真和”这里甚至有点道理。看看我的答案——这是完全可以做到的,没有任何技巧或括号。虽然这是可行的,但我怀疑这是如何解析行的副作用。由于连续行没有相同的缩进,它不能将它们放在同一个对象中。显然,它没有引发语法错误,而是启动了一个新的object、 这是一个可能不应该依赖的功能,除非你能找到它的文档。@hpaulj好吧,如果你有更好的方法来做到这一点,我很高兴Python是我的“第一语言”,我不怕使用一些额外的括号和大括号。即使Coffeescript不需要它们,我发现它们也很有用。你的第二块代码更具可读性。因为这是一个奇怪的外观解决方案,逗号很容易漏掉。这很危险!!有时只会给你一个包含最后一项的数组!请参见下面的示例。@DeanRadcliffe如果你没有正确放置逗号,它将返回数组中的最后一项,是的,但CoffeeScript不是建立在syn之上的约定前提下的吗战术糖?我会缩进开头
[
在下一行的左边,它已经够让人困惑的了。.我认为coffeescript不是对vanilla的简化和改进,而是会产生更多不必要的复杂问题。我想只使用plain.js与rails集成,而不需要coffee.wtf mountain dew与此有关系吗?我认为这很重要比逗号解决方案更好,在那里你必须小心逗号的位置。