在CoffeeScript中定义匿名对象数组


105

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

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

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

但是,如果这两个对象没有名称,则将有些棘手

Answers:


28

您不能:

这是一些技巧:

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

另一个

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

这是最好的:

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

6
不是那么丑陋:( Coffeescript真的很不错,因为它是基于缩进的编码,但是对于大对象文字来说,它并没有比标准JSON好多少,因为您必须平衡所有括号,最后得到的是讨厌的结尾括号汤。一票来解决这个并使用YAML语法,但显然存在CoffeeScript的解析歧义解决这个这是不幸的。
bradgonesurfing

当然,可以使用等效的“是和”或“否或”代替“ true &&”。“是和”在这里甚至很有意义。
Jameson Quinn

18
看看我的答案-这是完全可行的,没有任何花招或花括号。
迈克尔·海斯

301

简单-将逗号单独放在比定义对象的位置低的列中。

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
因为它的怪异的查找解决方案和逗号很容易被忽略
Eddie Monge Jr 2013年

这很危险!有时只给您最后一项的数组!见我下面的例子..
迪恩拉德克利夫

1
@DeanRadcliffe如果您未正确放置逗号,它将返回数组中的最后一项,是的,但是CoffeeScript是否不是在语法糖惯例的前提下构建的?
dubilla

我会缩进开[到下一行的左边,它是作为混淆够..
matanster

4
我认为coffeescript而不是对香草的简化和改进会产生更多不必要的并发症。很想只使用简单的.js与rails集成,而无需喝咖啡。
LasagnaAndroid 2014年

40

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

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

14

我认为逗号解决方案更好,但是我想为完整起见添加此代码:

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

我认为这比逗号解决方案要好得多,在逗号解决方案中,您必须注意逗号放置。
尼玛

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

1

这不是对OP的问题的答案,但万一您因我的相同原因而在这里...如果您不喜欢Mountain Dew并使用'='而不是':',那么Coffeescript将打开您的数组将对象放入平面数组中,没有编译错误:

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

产生

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

插入更多的山露并将'='替换为':'。


2
wtf与山露水有关吗?
芬特

1

经过一番摆弄之后,我很高兴地报告我可以正确编译该文件:

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

结果就是您所期望的:两个匿名对象的列表。


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

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


虽然这样做有效,但我怀疑这是如何解析行的副作用。由于连续的行没有相同的缩进,因此不能将它们放在同一对象中。显然,它没有引发语法错误,而是启动了一个新对象。该功能可能不值得信赖-除非您找到记录在案的功能。
hpaulj 2013年

@hpaulj好,如果你有一个更好的办法来做到这一点,我所有的耳朵
jcollum

1
因为Python是我的“第一语言”,所以我不怕使用一些额外的括号和花括号。即使Coffeescript不需要它们,我也认为它们会有所帮助。您的第二个块更具可读性。
hpaulj 2013年

0

为什么不:

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

对我而言,它仍然比js有了很大的改进,非常易于阅读,最小并且编写非常安全。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.