在 CoffeeScript 中定义一组匿名对象

Posted

技术标签:

【中文标题】在 CoffeeScript 中定义一组匿名对象【英文标题】:Defining an array of anonymous objects in CoffeeScript 【发布时间】:2012-02-20 05:12:41 【问题描述】:

如何?这是否可能,使用 YAML 语法?

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

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

但是,如果这两个对象没有名称,那就有点棘手了

【问题讨论】:

【参考方案1】:

为什么不:

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

相对于 js,它对我来说仍然是一个巨大的进步,非常容易阅读,最小且写起来很安全。

【讨论】:

【参考方案2】:

我很高兴在经过一番折腾后报告我可以正确编译:

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

结果如您所愿:两个匿名对象的列表。

【讨论】:

【参考方案3】:

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

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

【讨论】:

因为它看起来很奇怪,而且很容易错过逗号 这很危险!!有时只给你一个包含最后一项的数组!请参阅下面的示例.. @DeanRadcliffe 如果你没有正确放置逗号,它会返回数组中的最后一项,是的,但是CoffeeScript不是建立在语法糖约定的前提下吗? 我会把开头的[缩进下一行的左边,这已经够混乱了.. 我认为,coffeescript 不是对原版的简化和改进,而是产生了更多不必要的复杂性。很想只使用简单的 .js 和 rails 集成,而不需要喝咖啡。【参考方案4】:

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

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】:

不是对 OP 问题的回答,但以防万一您出于与我相同的原因来到这里...将您的对象数组转换为平面数组而不会出现编译错误:

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

生产

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

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

【讨论】:

wtf 山露跟这个有关系吗?【参考方案6】:

我遇到了一个相关问题并找到了这个解决方案。如果你想要一个包含许多没有大括号的单个 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 好吧,如果你有更好的方法来做到这一点,我会全力以赴 由于Python 是我的“第一语言”,我不怕使用一些额外的括号和大括号。即使 Coffeescript 不需要它们,我也觉得它们很有帮助。您的第二个块更具可读性。【参考方案7】:

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

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

【讨论】:

我认为这比逗号解决方案要好得多,您必须小心逗号的放置。【参考方案8】:

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

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

【讨论】:

【参考方案9】:

你不能:

这是一些技巧:

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

另一个

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

这是最好的:

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

【讨论】:

不是那么难看吗 :( Coffeescript 非常好,因为它是基于缩进的编码,但对于大型对象文字,它并不比标准 JSON 好多少,因为你必须平衡所有括号,你最终会带有讨厌的尾括号汤。有一张票可以解决这个问题并使用 YAML 语法,但显然咖啡脚本中存在解析歧义来解决这个问题,这是不幸的。 您当然可以使用等效的“yes and”或“no or”来代替“true &&”。 “是的,”在这里甚至有点道理。 查看我的答案——这完全可行,无需任何技巧或括号。

以上是关于在 CoffeeScript 中定义一组匿名对象的主要内容,如果未能解决你的问题,请参考以下文章

匿名函数

匿名函数

在 CoffeeScript 中,如何使用匿名函数作为参数进行函数调用?

1. lamda匿匿名函数 2. sorted() 3. ?lter() 4. map() 5. 递归函数

如何在 CoffeeScript 中将两个匿名函数作为参数传递?

python 之匿名函数