我们说我有以下对象:
dict = { a: 1, b: 2, c: 3 }
以下作品完美无缺:
{a, b} = dict
// -> a = 1
// -> b = 2
现在我想操纵这些数字并将其写回对象并明确跟随行不起作用:
// some manipulations
dict = {a, b}
显然我已经覆盖了dict
个对象。我本来想要做的是分配dict.a = a
和dict.b = b
,dict.c
保持原样。
是否有可能通过某种简短的符号来实现我的目标?
答案 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中也存在类似的扩展函数。