Как в 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.