2012-01-27 76 views
97

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

我知道,有一个名为对象的数组是很容易的:

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

然而,这将是一个有点麻烦,如果这两个对象没有名称

回答

31

不能:

这是一些技巧:

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

另一个

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

这是最好的:

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

是不是这么丑:(CoffeeScript中是非常好的了它是一个基于缩进编码,但对于大型对象文本,它比标准的JSON也不遑多让,你必须权衡了所有的支架和你结束了讨厌的悬架托架汤有是解决这一点,并使用YAML语法票,但显然存在CoffeeScript的解析歧义解决这个这是不幸的。 – bradgonesurfing 2012-04-16 16:46:28

+0

而不是“真&&”你当然可以用等价物“是和”或“否或者” “是的”连那种有道理这里 – 2012-12-03 03:04:47

+12

看看我的答案 - 。这是一个没有任何技巧或支架完全可行 – 2012-12-27 18:15:19

39

您还可以添加一个昏迷的每个对象之间:

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

简单 - 在低于一列中放置一个逗号本身你定义你的对象。

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

,因为它的一个奇怪的看着溶液和逗号很容易错过 – 2013-10-03 23:29:09

+0

这是危险的!有时候只给你最后一个项目的数组!见下面的例子.. – 2013-10-11 19:41:55

+1

@DeanRadcliffe它会返回数组中的最后一项,如果你没有正确放置逗号,是的,但不是建立在通过语法糖的约定前提下的CoffeeScript? – dubilla 2014-01-16 21:42:44

14

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

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

我认为这比逗号解决方案好得多,你必须小心逗号放置。 – nima 2015-09-05 06:50:30

0

我遇到了一个相关的问题,找到这个解决方案如果你想多单ķ/ 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 } ] 

这是反直觉我。你会认为这将使子对象,但我认为在该行的末尾逗号告诉它停止该对象的加工特性。

+0

虽然这个工作,我怀疑这是线如何解析的副作用。由于连续的行不具有相同的缩进,因此不能将它们放在同一个对象中。显然,它不会引发语法错误,而是启动一个新对象。这是一个功能,可能不应该指望 - 除非你能找到它的记录。 – hpaulj 2013-09-25 20:11:02

+0

@hpaulj好,如果你有一个更好的办法来做到这一点,我所有的耳朵 – jcollum 2013-09-25 20:55:54

+1

由于'Python'是我的第一语言',我不害怕使用了一些额外的括号和大括号。即使Coffeescript不需要它们,我也觉得它们很有帮助。你的第二块更具可读性。 – hpaulj 2013-09-25 22:28:06

1

不是一个答案OP的问题,但以防万一你在这里出于同样的原因我......如果你在激浪和使用“=”,而不是很低“:”,然后CoffeeScript的会变成你的对象的数组成平面阵列,而不编译错误:

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

主要生产

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

插入更多的激浪和更换“=”与“:”。

+2

跆拳道山脉露水与此有关吗? – fent 2014-12-05 20:52:01

+1

书呆子燃料。咄。 – Seth 2014-12-06 01:12:53

2

在定义阵列可以定义变量,所以一个丑陋的答案是:

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

我很高兴有点摆弄,我可以的后报告得到这个编译恰到好处:

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

它的结果是你所期望的正是:两个匿名对象的列表。