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.

Respostas:



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)

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.