在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; @