在CoffeeScript中理解的对象

有没有办法从coffeescript的理解返回一个对象? 这样我可以expression这一点:

form_values = () -> ret = {} ret[f.name] = f.value for f in $('input, textarea, select') return ret 

喜欢这个:

 form_values = () -> f.name, f.value for f in $('input, textarea, select') 

我想构build一个单一的对象 (不是一个对象数组)。 所以如果标记看起来像这样:

 <form name=blah> <input type=text name=blah1 value=111 /> <textarea name=blah2>222</textarea> <select name=blah3> <option value=333a> <option value=333b> </select> </form> 

返回的对象将是这样的:

 { blah1: '111', blah2: '222', blah3: '' } 

不。 理解仅在CoffeeScript中返回数组。 search问题跟踪器的对象parsing ,你会发现几个提案,但没有被发现适合。

 form_values = new -> @[f.name] = f.value for f in $ 'input, textarea, select' this 

要么

 form_values = new class then constructor: -> @[f.name] = f.value for f in $ 'input, textarea, select' 

检查函数库下划线和从这个mixin的扩展名_.mash

 form_values = -> _($('input, textarea, select')).mash f -> [f.name, f.value] 

使用下划线的对象function ,你可以这样做:

 form_values = _.object([f.name, f.value] for f in $('input, textarea, select')) 

这已经得到了回答,但可能缺乏一些解释,因为这个成语是一见钟情:

 form_values = (new -> @[f.name] = f.value for f in $ 'input, textarea, select'; @) // ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ // create with | // a new that | // empty anonymous | // object constructor | // don't forget -/ // to return the // newly created object 

关键的想法是创build一个空的对象( new )与一个匿名构造函数( -> ... ),将创build各个领域。

我相信你可以在CoffeeScript中没有添加库。

这应该是一些效果:

 $('input, textarea, select').each (item) => @form_values || @form_values = {}; @form_values[$(item).name] = $(item).value 

你可以通过预先创buildform_values来简化它的语法:

 form_values = {} $('input, textarea, select').each (item) -> form_values[$(item).name] = $(item).value 

这里是一个较长的答案与jar头的例子:

举一个非常简单的例子,您可以将obj映射到名称值:

 items = [ { a: 1 }, { b: 2 }, { c: 3 } ] items.map((item) -> {name: Object.keys(item)[0], value: item[Object.keys(item)[0]]}) 

[{name:'a',value:1},{name:'b',value:2},{name:'c',value:3}]

请注意,以上并不是一个真正的对象理解,只是示范。

现在让我们说有更多的结构,你只是想映射一个已知的唯一键:

 items = [{key: "abc", someVar: 1}, {key: "def", someVar: 2}] 

在Python中,你可以做一些简单的事情: {x['key']:x for x in items}

在CoffeeScript中,您可以将所有这一切都归结为一行,但有一点需要注意:

 items.forEach (item) => @x || @x = {}; @x[item['key']] = item 

{abc:{key:'abc',someVar:1},def:{key:'def',someVar:2}}

在上面的代码中,x是以前没有在范围中定义的,所以使用=>@允许我们将x绑定到@x || @x = {} 如果之前没有find@x || @x = {} ,则设置密钥。

如果你不想使用=>和@,你必须事先定义x:

 x = {} items.forEach (item) => x || x = {}; x[item['key']] = item 

{abc:{key:'abc',someVar:1},def:{key:'def',someVar:2}}

CoffeeScript的创build者build议使用帮助函数将一个数组对转换成一个对象:

 form_values = toObject([f.name, f.value] for f in $('input, textarea, select')) 

这可以说是目前语言语法中最可读的方法。 除了缺less语法糖之外,它和Python和其他语言也是如此。

辅助函数可以很容易地写一次,例如使用@ matyr和@ Sylvain的答案:

 // Create a new object from an array of [key, value] pairs. toObject = (pairs) -> new -> @[key] = value for [key, value] in pairs; @