Javascript 将对象传递给接受参数列表的函数

Javascript 将对象传递给接受参数列表的函数,javascript,coffeescript,Javascript,Coffeescript,我有一个函数定义如下 postEvent = (data) -> throw new Error("category is required for structured events") if not category throw new Error("action is required for structured events") if not action $window.submit 'type1', data.category, data.action, data.l

我有一个函数定义如下

postEvent = (data) ->
 throw new Error("category is required for structured events") if not category
 throw new Error("action is required for structured events") if not action

 $window.submit 'type1', data.category, data.action, data.label, data.property, data.value
类别和操作是必需的,但其余的不是。如果
数据
对象不包含给定值,则不应传递该值

我可以使用大量的if语句,但我怀疑还有更好的方法。 因此,我正在寻找一种方法来展开对象值并传递给另一个函数

例如

data = {category: 'cat1', action: 'action1', value: 1.2}
postEvent(data)
这将导致以下结果

$window.submit 'type1', 'cat1', 'action1', 1.2
您可以使用:

然后可以使用
call
应用所有参数:

$window.sumbit.call $window, category, action, value
如果需要验证,我建议采用不同的方法:

DATA_ORDERING = ['category', 'action', 'value']

postEvent = (data) ->
  let stuff = Object.keys data
    .sort (a, b) -> DATA_ORDERING.indexOf(a) - DATA_ORDERING.indexOf(b)
    .map (k) -> data[k]

  let valid = stuff.every (item) -> item? #make sure non-null

  if valid then $window.submit.apply $window, stuff
  • 收集所需的参数

    params = [data.category, data.action]
    
    OPTIONAL = ['label', 'property', 'value']
    for prop in OPTIONAL
      params.push(data[prop]) if data.hasOwnProperty(prop)
    
  • 收集所有可选参数

    params = [data.category, data.action]
    
    OPTIONAL = ['label', 'property', 'value']
    for prop in OPTIONAL
      params.push(data[prop]) if data.hasOwnProperty(prop)
    
  • 使用
    apply

    $window.submit.apply($window, params)