可以使用解构赋值来实现CoffeeScript中的投影吗?

时间:2011-11-16 19:40:56

标签: javascript coffeescript destructuring

我在理解CoffeeScript中的解构赋值时遇到了一些麻烦。 documentation包含几个示例,这些示例似乎一起暗示在赋值期间重命名对象可用于投影(即映射,转换,转换)源对象。

我正在尝试将a = [ { Id: 1, Name: 'Foo' }, { Id: 2, Name: 'Bar' } ]投射到b = [ { x: 1 }, { x: 2 } ]。我试过以下但没有成功;我明显误解了一些事情。任何人都可以解释这是否可能?

我的穷人试图不归[ { x: 1 }, { x: 2 } ]

a = [ { Id: 1, Name: 'Foo' }, { Id: 2, Name: 'Bar' } ]

# Huh? This returns 1.
x = [ { Id } ] = a

# Boo! This returns [ { Id: 1, Name: 'Foo' }, { Id: 2, Name: 'Bar' } ] 
y = [ { x: Id } ] = a

# Boo! This returns [ { Id: 1, Name: 'Foo' }, { Id: 2, Name: 'Bar' } ]
z = [ { Id: x } ] = a

CoffeeScript的并行分配示例

theBait   = 1000
theSwitch = 0

[theBait, theSwitch] = [theSwitch, theBait]

我理解这个例子暗示可以重命名变量,在这种情况下用于执行交换。

CoffeeScript的任意嵌套示例

futurists =
  sculptor: "Umberto Boccioni"
  painter:  "Vladimir Burliuk"
  poet:
    name:   "F.T. Marinetti"
    address: [
      "Via Roma 42R"
      "Bellagio, Italy 22021"
    ]

{poet: {name, address: [street, city]}} = futurists

我理解这个例子是从任意对象中定义一系列属性,包括将数组的元素分配给变量。

更新:使用jh的解决方案来展平嵌套对象数组

a = [ 
  { Id: 0, Name: { First: 'George', Last: 'Clinton' } },
  { Id: 1, Name: { First: 'Bill', Last: 'Bush' } },
]

# The old way I was doing it.
old_way = _.map a, x ->
    { Id: id, Name: { First: first, Last: last } } = x
    { id, first, last }

# Using thejh's solution...
new_way = ({id, first, last} for {Id: id, Name: {First: first, Last: last}} in a)

console.log new_way

2 个答案:

答案 0 :(得分:3)

b = ({x} for {Id: x} in a)有效:

coffee> a = [ { Id: 1, Name: 'Foo' }, { Id: 2, Name: 'Bar' } ]
[ { Id: 1, Name: 'Foo' },
  { Id: 2, Name: 'Bar' } ]
coffee> b = ({x} for {Id: x} in a)
[ { x: 1 }, { x: 2 } ]
coffee>

答案 1 :(得分:2)

CoffeeScript Cookbook解决与您完全相同的问题 - 解决方案是map

b = a.map (hash) -> { x: hash.id }

list comprehension

c = ({ x: hash.id } for hash in a)

您可以查看this fiddle online on CoffeScript homepage(使用console.info显示结果)。

编辑:

要使其具有破坏性,只需将映射变量a分配给自身:

a = a1 = [ { Id: 1, Name: 'Foo' }, { Id: 2, Name: 'Bar' } ]
a = a.map (hash) -> { x: hash.Id }
console.info a;
a1 = ({ x: hash.Id } for hash in a1)
console.info a1;