在 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. 递归函数