Можно ли использовать назначение деструктурирования для создания проекции в CoffeeScript? - PullRequest
4 голосов
/ 16 ноября 2011

У меня возникли проблемы с пониманием деструктурирующего назначения в 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

Я понимаю этот пример как определение выбора свойств из произвольного объекта, который включает в себя присвоение элементов массива переменным.

Обновление: использование решения 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 ]

3 голосов
/ 17 ноября 2011

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>
2 голосов
/ 17 ноября 2011

CoffeeScript Cookbook решает точно такую ​​же проблему, как ваша - решение - map :

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

или понимание списка :

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

Вы можете проверить эту скрипку онлайн на домашней странице CoffeScript (использует console.info для отображения результатов).

EDIT:

Чтобы сделать его разрушительным, просто назначьте сопоставленную переменную 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...