在CoffeeScript中定义匿名对象数组
如何在CoffeeScript中定义匿名对象数组?使用YAML语法,这可能吗 我知道拥有命名对象数组非常容易:在CoffeeScript中定义匿名对象数组,coffeescript,Coffeescript,如何在CoffeeScript中定义匿名对象数组?使用YAML语法,这可能吗 我知道拥有命名对象数组非常容易: items:[ item1: name1:value1 item2: name:value2 ] 但是,如果这两个对象没有名称,则会有点棘手,您不能: 这是一些技巧: items:[ (name:"value1") (name:"value2") ] 另一个 items:[ true && name:"va
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与此有关系吗?我认为这很重要比逗号解决方案更好,在那里你必须小心逗号的位置。