Как в CoffeeScript добавить значение в массив?

98

Каков предписанный способ добавления значения в массив в CoffeeScript? Я проверил книгу PragProg CoffeeScript, но в ней обсуждаются только создание, нарезка, склейка и повторение, но не добавление.

Дэйв Саг
источник

Ответы:

192

Старый добрый pushеще работает.

x = []
x.push 'a'
Тило
источник
9
Автор книги PragProg здесь. +1 к ответу Тило. Я не хотел Arrayописывать в книге методы прототипа, поскольку уже существует множество хорошей документации по JavaScript. См., Например, developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Trevor Burnham
А если у нас есть объект, а не персонаж?
Gaʀʀʏ
Я ожидал x << 'a'работы.
Chloe
49

Намного лучше использовать списки.

Например, вместо этого:

things = []
for x in list
  things.push x.color

сделайте это вместо этого:

things = (x.color for x in list)
сураньями
источник
23
Это не добавляет значения из списка к вещам. Это полностью заменяет массив вещей. Я его тоже только что тестировал.
ajsie
Ну, конечно, ajsie, ты прав, он заменяет его, а не добавляет. Дело, однако, в том, что обычно, когда вы нажимаете, вы в любом случае часто делаете что-то вроде понимания массива. По общему признанию, не во всех случаях, но очень часто.
suranyami
3
@suranyami Напротив, я не могу придумать для этого ничего хорошего. Я бы предпочел просто сделать things = list, это гораздо лаконичнее.
Michael Dorst
@suranyami Ссылка мертвая.
derekdreery
@anthropomorphic Ну, конечно. Это надуманный пример. Скажем, вместо этого это что-то вроде этого: colors = (item.color for item in list)
suranyami
2

Если вы объединяете вызовы, вам нужно, чтобы добавление возвращало массив, а не его длину. В этом случае вы можете использовать .concat ([newElement])

Должен быть [newElement], поскольку concat ожидает массив, подобный тому, с которым он связан. Неэффективно, но в правильной обстановке выглядит круто.

Пол Скуллинг
источник
Цепочка вызовов - это более стильная вещь, которую вы можете сделать, однако, как вы заявили, «метод неэффективен» - concatвозвращает новый массив, построенный из элементов массива A + array B. Ссылки на объекты сохраняются, поэтому изменения в объекте, на который имеется ссылка в любом массиве A, массиве B или результат concat также будет отражен в других массивах.
SidOfc