解构赋值可以用于影响 CoffeeScript 中的投影吗?

发布于 2024-12-15 16:41:38 字数 1665 浏览 4 评论 0原文

我在理解 CoffeeScript 中的解构赋值时遇到一些困难。 文档包含几个示例,这些示例似乎暗示在赋值期间重命名对象可以用于投影(即映射、平移、变换)源对象。

我正在尝试将 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

我将此示例理解为从任意对象定义属性选择,其中包括将数组的元素分配给变量。

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

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

I'm having some trouble understanding destructuring assignment in CoffeeScript. The documentation contains a couple of examples which together seem to imply that renaming objects during assignment can be used to project (i.e. map, translate, transform) a source object.

I am trying to project a = [ { Id: 1, Name: 'Foo' }, { Id: 2, Name: 'Bar' } ] into b = [ { x: 1 }, { x: 2 } ]. I've tried the following without success; I've clearly misunderstood something. Can anyone explain whether this is possible?

My Poor Attempts That Don't Return [ { 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's Parallel Assignment Example

theBait   = 1000
theSwitch = 0

[theBait, theSwitch] = [theSwitch, theBait]

I understand this example as implying that variables can be renamed which in this case is used to perform a swap.

CoffeeScript's Arbitrary Nesting Example

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

I understand this example as defining a selection of properties from an arbitrary object which includes assigning the elements of an array to variables.

Update: Using thejh's Solution to Flatten an Array of Nested Objects

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤芳又自赏 2024-12-22 16:41:40

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>

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

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>
笙痞 2024-12-22 16:41:40

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

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

列表理解

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

您可以检查 这个小提琴在 CoffeScript 主页上在线(使用 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;

CoffeeScript Cookbook solves exactly the same problem as yours - solution is map:

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

or list comprehension:

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

You can check this fiddle online on CoffeScript homepage (uses console.info to show results).

EDIT:

To make it destrutive just assign mapped variable a to itself:

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文