1

假设我有以下对象:

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原样。

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

4

3 回答 3

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 }

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

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

于 2012-11-28T20:29:26.520 回答
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 }
于 2012-11-28T20:16:05.343 回答
0

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

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

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

于 2012-11-28T19:44:55.607 回答