【发布时间】:2012-02-20 05:12:41
【问题描述】:
如何在 CoffeeScript 中定义一组匿名对象?这是否可能,使用 YAML 语法?
我知道拥有一组命名对象非常简单:
items:[
item1:
name1:value1
item2:
name:value2
]
但是,如果这两个对象没有名称,那就有点棘手了
【问题讨论】:
标签: coffeescript
如何在 CoffeeScript 中定义一组匿名对象?这是否可能,使用 YAML 语法?
我知道拥有一组命名对象非常简单:
items:[
item1:
name1:value1
item2:
name:value2
]
但是,如果这两个对象没有名称,那就有点棘手了
【问题讨论】:
标签: coffeescript
为什么不:
list = []
list.push
prop1: val
prop2: val
list.push
prop1: val
prop2: val
相对于 js,它对我来说仍然是一个巨大的进步,非常容易阅读,最小且写起来很安全。
【讨论】:
我很高兴在经过一番折腾后报告我可以正确编译:
items: [
nameA: subA
nameB: subB
,
nameX: subX
nameY: subY
]
结果如您所愿:两个匿名对象的列表。
【讨论】:
简单 -- 将逗号单独放在比您定义对象的列低的列中。
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 =
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"
}
]
}
【讨论】:
不是对 OP 问题的回答,但以防万一您出于与我相同的原因来到这里...将您的对象数组转换为平面数组而不会出现编译错误:
data = [
one='one'
two='two'
,
one='1'
two='2'
]
生产
['one', 'two', '1', '2']
插入更多 Mountain Dew 并将 '=' 替换为 ':'。
【讨论】:
我遇到了一个相关问题并找到了这个解决方案。如果你想要一个包含许多没有大括号的单个 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 } ]
这对我来说是违反直觉的;你会认为这会产生子对象,但我认为行尾的逗号告诉它停止在该对象上创建属性。
【讨论】:
Python 是我的“第一语言”,我不怕使用一些额外的括号和大括号。即使 Coffeescript 不需要它们,我也觉得它们很有帮助。您的第二个块更具可读性。
我认为逗号解决方案更好,但我想我会为了完整性添加这个:
a = [
{
nameA1: valueA1
nameA2: valueA2
nameA3: valueA3
}
{
nameB1: valueB1
nameB2: valueB2
nameB3: valueB3
}
]
【讨论】:
您还可以在每个对象之间添加一个逗号:
items:[
item1:
name1:value1
,
item2:
name:value2
]
【讨论】:
你不能:
这是一些技巧:
items:[
(name:"value1")
(name:"value2")
]
另一个
items:[
true && name:"value1"
true && name:"value2"
]
这是最好的:
items:[
{name:"value1"}
{name:"value2"}
]
【讨论】: