【问题标题】:CoffeeScript: Assigning values to objectCoffeeScript:为对象赋值
【发布时间】:2012-11-16 17:46:30
【问题描述】:

假设我有以下对象:

dict = { a: 1, b: 2, c: 3 }

以下工作完美:

{a, b} = dict
// -> a = 1
// -> b = 2

现在我想操纵这些数字并将其写回对象,显然以下行不起作用:

// some manipulations
dict = {a, b}

显然我已经覆盖了dict 对象。我本质上想要做的是分配dict.a = adict.b = b,而dict.c 保持原样。

是否可以通过某种简短的符号来实现我的目标?

【问题讨论】:

标签: coffeescript


【解决方案1】:

您可以使用以下方法将对象的切片提取到单独的局部变量中:

{a, b} = dict

但是没有办法分配给一个对象的切片,即你不能做这样的事情:

dict{a, b} = [ x, y ]

作为快捷方式

dict.a = x
dict.b = y

你甚至不能用这样的东西将一个对象切片提取到一个新对象中:

obj = dict{a, b}

您必须分两步完成:

{ a, b } = dict
obj      = { a, b }

Destructured assignments 可以很好地从对象中取出东西,但它们对于将东西放回对象中并没有那么有用。我认为你能得到的最接近的是使用解构数组赋值:

[ dict.a, dict.b ] = [ a, b ]

如果您使用多个键,那么您可以将键放在一个数组中并使用循环进行切片和合并(可能包含在辅助函数中):

slice = (obj, keys...) ->
    s = { }
    s[k] = obj[k] for k in keys
    s

merge = (dest, src) ->
    dest[k] = src[k] for k of src
    return

keys = [ 'a', 'b' ]
dict = { a: 1, b: 2, c: 3 }
s = slice(dict, keys...)
s.a += 6
s.b += 6
merge(dict, s)
# dict is now { a: 7, b: 8, c: 3 }

或者只使用 Underscore、jQuery、... 实用函数。

【讨论】:

    【解决方案2】:

    在纯咖啡脚本中:

    extend = (a, others...) ->
      for o in others
        a[key] = val for key, val of o
      a
    
    dict = { a: 1, b: 2, c: 3 }
    {a, b} = dict
    
    a = 5
    b = 8
    
    extend dict, {a, b}
    
    console.log dict
    #dict = { a: 5, b: 8, c: 3 }
    

    【讨论】:

    • 考虑到我没有使用任何框架,也没有参与编写任何辅助函数,我最初的问题的简短答案是否定的?
    • 可能我不知道没有声明你的函数的另一种方法。
    【解决方案3】:

    假设您使用的是 underscore.js,我会这样做:

    dict = { a: 1, b: 2, c: 3 }
    {a, b} = dict
    ...
    dict = _.extend dict, {a:a, b:b}
    

    asawyer 指出,jQuery 中也有类似的扩展函数。

    【讨论】:

    • _.extend 修改了它的第一个参数,所以你不需要赋值。
    • 或者更好:_.extend dict, {a, b}。此外,_.extend 将修改 dict 对象本身,因此无需重新分配它 :) (编辑:似乎 mu 太短了,比我快,呵呵)
    • 考虑到我没有使用任何框架,也没有参与编写任何辅助函数,我最初的问题的简短答案是否定的?
    • @Amberlamps:我认为简短的答案是,冗长的答案在下方(或上方取决于投票)。
    猜你喜欢
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2013-03-20
    相关资源
    最近更新 更多