No CoffeeScript, como você acrescenta um valor a um Array?

98

Qual é a maneira prescrita de acrescentar um valor a um Array no CoffeeScript? Verifiquei o livro PragProg CoffeeScript, mas ele apenas discute a criação, o corte e a emenda, e a iteração, mas não o acréscimo.

Dave Sag
fonte

Respostas:

192

O bom e velho pushainda funciona.

x = []
x.push 'a'
Thilo
fonte
9
Autor do livro PragProg aqui. +1 para a resposta de Thilo. Eu não queria cobrir os Arraymétodos de protótipo no livro, uma vez que já existe uma grande quantidade de boa documentação JavaScript por aí. Veja, por exemplo, developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Trevor Burnham
E se tivermos um objeto e não um personagem?
Gaʀʀʏ
Eu esperava x << 'a'trabalhar.
Chloe,
49

Muito melhor é usar compreensões de lista.

Por exemplo, em vez disso:

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

faça isso ao invés:

things = (x.color for x in list)
Suranyami
fonte
23
Isso não acrescenta valores da lista às coisas. Isso substitui a matriz de coisas inteiramente. Eu também testei.
ajsie
Bem, claro ajsie, você está correto, ele substitui, não acrescenta. O ponto é, entretanto, que geralmente quando você está empurrando, você frequentemente está fazendo algo semelhante a uma compreensão de array de qualquer maneira. Não em todos os casos, é certo, mas na maior parte do tempo.
suranyami
3
@suranyami Pelo contrário, não consigo pensar em nenhum uso bom para isso. Prefiro apenas fazer things = list, é muito mais sucinto.
Michael Dorst
@suranyami O link está morto.
derekdreery
@anthropomorphic Bem, é claro. É um exemplo artificial. Digamos que seja algo assim: colors = (item.color for item in list)
suranyami
2

Se estiver encadeando chamadas, você deseja que o acréscimo retorne a matriz em vez de seu comprimento. Neste caso, você pode usar .concat ([newElement])

Tem que ser [newElement], pois concat está esperando uma matriz como aquela para a qual está se concatenando. Não é eficiente, mas parece legal no ambiente certo.

Paul Schooling
fonte
Encadear chamadas é mais uma coisa elegante que você pode fazer, no entanto, como você afirmou "o método não está sendo eficiente" - concatretorna uma nova matriz construída a partir dos elementos da matriz A + matriz B. As referências aos objetos são mantidas, portanto, as alterações a um objeto referenciado na matriz A, na matriz B ou no resultado do concat também será refletido nas outras matrizes.
SidOfc