Sempre achei a range
função ausente no JavaScript, pois está disponível em python e outros? Existe alguma maneira concisa de gerar um intervalo de números no ES2015?
EDITAR: MINHA pergunta é diferente da duplicata mencionada, pois é específica para ES2015 e não ECMASCRIPT-5. Também preciso que o intervalo comece em 0 e não um número inicial específico (embora seja bom se estiver lá)
javascript
arrays
ecmascript-6
Aditya Singh
fonte
fonte
[...Array(n).keys()]
.[...Array(5)].map((_,i) => i+1)
Respostas:
Você pode usar o operador spread nas chaves de um array recém-criado.
[...Array(n).keys()]
ou
Array.from(Array(n).keys())
A
Array.from()
sintaxe é necessária se estiver trabalhando com TypeScriptfonte
function range (start, end) { return [...Array(1+end-start).keys()].map(v => start+v) }
Array.from(Array(n).keys())
.[...Array(n).keys()]
que não funciona no Typescript? É um desvio intencional de outras implementações JS?Array(5).keys().slice()
e o slice não é um método de iterador de array. Aqui está um exemplo de que ele não está funcionando typescriptlang.org/play/…Também encontrei uma maneira mais intuitiva de usar
Array.from
:Agora esta
range
função irá retornar todos os números começando de 0 a n-1Uma versão modificada do intervalo para oferecer suporte
start
eend
é:EDITAR Como sugerido por @ marco6, você pode colocar isso como um método estático se for adequado ao seu caso de uso
e usá-lo como
fonte
interface ArrayConstructor { range(n: number): number[]; }
Array.range = n => Array.from({length: n}, (value, key) => key);
E em qualquer lugarArray.range(x)...
[ts] Property 'range' does not exist on type 'ArrayConstructor'
. thouths?Com Delta
Para javascript
Para texto datilografado
Atualizar
Editar
fonte
Array.from(Array(~~((to - from) / step) + 1).keys())
Para números de 0 a 5
fonte
Muitas dessas soluções se baseiam na instanciação de objetos Array reais, que podem realizar o trabalho em muitos casos, mas não podem suportar casos como o
range(Infinity)
. Você pode usar um gerador simples para evitar esses problemas e suportar sequências infinitas:Exemplos:
fonte
Portanto, neste caso, seria bom se o objeto Number se comportasse como um objeto Array com o operador spread.
Por exemplo, objeto Array usado com o operador spread:
Funciona assim porque o objeto Array tem um iterador embutido.
Em nosso caso, precisamos de um objeto Number para ter uma funcionalidade semelhante:
Para fazer isso, podemos simplesmente criar o iterador de número para esse propósito.
Agora é possível criar intervalos de 0 a N com o operador spread.
http://jsfiddle.net/01e4xdv5/4/
Felicidades.
fonte
Você pode usar uma função de gerador, que cria o intervalo lentamente apenas quando necessário:
Você pode usar uma função de gerador de ordem superior para mapear o
range
gerador:Se você não tem medo, pode até generalizar a abordagem do gerador para abordar uma gama muito mais ampla (trocadilho intencional):
Lembre-se de que os geradores / iteradores são inerentemente com estado, ou seja, há uma mudança de estado implícita com cada invocação de
next
. O estado é uma bênção mista.fonte
Intervalo com a etapa ES6, que funciona de forma semelhante ao python
list(range(start, stop[, step]))
:Exemplos:
fonte
Para apoiar delta
fonte
Você também pode fazer isso com um revestimento único com suporte de degrau como este:
((from, to, step) => ((add, arr, v) => add(arr, v, add))((arr, v, add) => v < to ? add(arr.concat([v]), v + step, add) : arr, [], from))(0, 10, 1)
O resultado é
[0, 1, 2, 3, 4, 5, 6 ,7 ,8 ,9]
.fonte
Esta função retornará uma sequência inteira.
fonte
no texto datilografado
fonte
Array.from
sintaxe de propagação e ambas . E então é exatamente igual à resposta existente.[...Array(n).keys()]
que não funciona no texto datilografado.Array.from(Array(n).keys())
. Tenho certeza de que deve funcionar, para o que a sintaxe literal com propagação se transpila?Aqui está outra variação que não usa
Array
.fonte
Os geradores agora permitem que você gere a sequência numérica preguiçosamente e usando menos memória para grandes intervalos.
Embora a pergunta indique especificamente ES2015, espero que muitos usuários do Typescript acabem aqui e a conversão para ES seja direta ...
As duas primeiras declarações de função são apenas para fornecer sugestões de conclusão mais informativas em seu IDE.
fonte
Que tal apenas mapear ...
Array (n) .map ((valor, índice) ....) é 80% do caminho até lá. Mas, por algum motivo estranho, não funciona. Mas há uma solução alternativa.
Para um intervalo
Estranho, esses dois iteradores retornam o mesmo resultado:
Array(end-start+1).entries()
eArray(end-start+1).fill().entries()
fonte