CoffeeScript:为对象分配值

时间:2012-11-28 19:01:58

标签: coffeescript

我们说我有以下对象:

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

以下作品完美无缺:

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

现在我想操纵这些数字并将其写回对象并明确跟随行不起作用:

// some manipulations
dict = {a, b}

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

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

3 个答案:

答案 0 :(得分:4)

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

{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,...实用程序函数。

答案 1 :(得分:1)

纯咖啡:

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 }

答案 2 :(得分:0)

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

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

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