1

我有以下代码

class A

  constructor: (@message) ->

  parse: (paramNames...) ->
    params = @message.split(/\s/)
    for value, i in params
      @[paramNames[i]] = value

a = new A('foo bar dim sum')
a.parse 'first', 'second', 'third', 'fourth'
console.log a

输出

{
  message: 'foo bar dim sum',
  first: 'foo',
  second: 'bar',
  third: 'dim',
  fourth: 'sum'
}

一切正常,我只是觉得该parse方法可以做得更干净一些。好像我做错了什么:S

parse()永远不会被用户调用;它仅在我正在编写的库内部使用。可以安全地假设paramNames.length并且params.length永远是 equal

4

2 回答 2

1

Underscore 的object功能正是您想要的。将其与_.extend

class A

  constructor: (@message) ->

  parse: (paramNames...) ->
    params = @message.split(/\s/)
    _.extend @, (_.object paramNames, params)

如果您不使用下划线,我认为您当前的解决方案已经非常清晰和简单。

于 2012-12-17T03:14:21.047 回答
0

您可以使用字符串替换功能,如下所示:

parse : (paramNames...) ->
    keyCount = 0
    @message.replace( /(\b\w+\b)/g , (match)->
        @[paramNames[keyCount++]] = match
    )

它比你在代码中使用的 split 方法和 for 迭代更有效。只要确保我使用的 RegExp 满足您的需求,您就可以将其更改为您需要的任何内容。

于 2012-12-17T03:28:23.993 回答