CoffeeScript中的理解对象[dict/hash comprehensions]

aar*_*acy 43 coffeescript

有没有办法从coffeescript的理解中返回一个对象?这样的东西,我可以表达这个:

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

像这样:

form_values = () -> f.name, f.value for f in $('input, textarea, select')
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

返回的对象将是这样的:

{
  blah1: '111',
  blah2: '222',
  blah3: ''
}
Run Code Online (Sandbox Code Playgroud)

mat*_*tyr 26

form_values = new ->
  @[f.name] = f.value for f in $ 'input, textarea, select'
  this
Run Code Online (Sandbox Code Playgroud)

要么

form_values = new class then constructor: ->
  @[f.name] = f.value for f in $ 'input, textarea, select'
Run Code Online (Sandbox Code Playgroud)

  • 聪明,但完全无法理解.有没有办法让下一代更具可读性? (9认同)

Tre*_*ham 23

不.理解只返回CoffeeScript中的数组.在问题跟踪器中搜索对象理解,您会找到几个提议,但没有一个被认为合适.

  • 遗憾的是,对象理解或至少某种功能对象构造函数应该是核心的一部分. (19认同)
  • 我回到同一个帖子,发现我已经投票了.我不敢相信这被忽略了,它非常有用. (4认同)

tok*_*and 7

检查功能库下划线_.mashmixin的扩展名:

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


reu*_*ano 7

使用下划线的对象功能,您可以这样做:

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