No Python, onde [2]
está uma lista, o código a seguir fornece essa saída:
[2] * 5 # Outputs: [2,2,2,2,2]
Existe uma maneira fácil de fazer isso com uma matriz em JavaScript?
Eu escrevi a seguinte função para fazê-lo, mas há algo mais curto ou melhor?
var repeatelem = function(elem, n){
// returns an array with element elem repeated n times.
var arr = [];
for (var i = 0; i <= n; i++) {
arr = arr.concat(elem);
};
return arr;
};
javascript
arrays
repeat
Curious2learn
fonte
fonte
Respostas:
Você pode fazer assim:
Dobra a matriz em cada iteração, para criar uma matriz muito grande com poucas iterações.
Nota: Você também pode melhorar bastante sua função usando em
push
vez deconcat
, poisconcat
criará uma nova matriz a cada iteração. Assim (mostrado apenas como um exemplo de como você pode trabalhar com matrizes):fonte
arr = new Array(len);
atribuir a elas pelo índice no loop, ou sejaarr[i] = value;
. Dessa forma, você paga apenas O (n) em vez de precisar realocar a matriz à medida que ela cresce. Em geral, é sempre melhor evitar o aumento de matrizes anexando quando possível. Se você souber o tamanho final, use-o.Array.from({length:5}).map(x => 2)
Em ES6 usando matriz de enchimento () Método
fonte
Array(5).fill([1,2,3]).flat()
. Observe que flat () ainda é muito experimental e o suporte ao navegador é ruim.fill
é avaliado uma vez; portanto,Array(9).fill(someMutable)
cria nove referênciassomeMutable
no array (a mutação de uma mutará 'todas elas').fonte
Array(...Array(10)).map(() => 5)
o operador de spread ou também paraArray.from(Array(10)).map(() => 5)
Array.from({length: 10}, () => 5);
lenght = 10
sem propriedades enumeráveis..map
funciona apenas em propriedades enumeráveis. O.apply
método pega essa matriz e mapeia-a em umarguments array
(um objeto semelhante a uma matriz) a ser passado para aArray
função construtora. A matriz de argumentos não pode ser esparsa, portanto, as propriedades ausentes são definidasundefined
e se tornam enumeráveis. Agora podemos usar.map
como pretendidopodes tentar:
Atualização (01/06/2018) :
Agora você pode repetir um conjunto de caracteres.
Nota: Verifique mais sobre preenchimento (...) e de (...) para compatibilidade e suporte ao navegador.
Atualização (11/05/2019) :
Outra maneira, sem usar
fill
oufrom
, que funciona para cadeias de caracteres de qualquer comprimento:fonte
Array.from({length:5}, i => 1) // [1, 1, 1, 1, 1]
ou criar matriz com valor crescente
Array.from({length:5}, (e, i)=>i) // [0, 1, 2, 3, 4]
fonte
Array.from({length:5}, i => 1)
=>i
éundefined
porque representa valor vazioArray.from({length:5}, (e, i)=>i)
=>e
éundefined
porque representa valor vazio. Deve serArray.from({length:5}, v => 1)
eArray.from({length:5}, (v, i)=>i)
No lodash não é tão ruim:
EDIT : Ainda melhor:
EDIT : Ainda melhor:
fonte
[c] * n
pode ser escrito como:então para
[2] * 5
fonte
Você também pode estender a funcionalidade do Array da seguinte maneira:
Devo observar que estender a funcionalidade de objetos internos pode causar problemas se você estiver trabalhando com bibliotecas de terceiros. Sempre avalie isso em suas decisões.
fonte
fill
cada índice da matriz, se referirá ao mesmo objeto, portanto, alterar um mudará todos eles. Isso não é muito difícil de resolver se se tornar um problema.if (!Array.prototype.fill) { }
No NPL.js REPL:
fonte
Array.from({length: 5}, x => 2);
ref. https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Using_arrow_functions_and_Array.fromCaso você precise repetir uma matriz várias vezes:
inspirado por esta resposta
fonte
Não há maneira mais fácil. Você precisa fazer um loop e inserir elementos na matriz.
fonte
push
melhor ouconcat
melhor, em termos de eficiência?Use esta função:
Ou para uma versão mais compacta:
Ou para uma versão com capacidade para curry:
Você pode usar esta função com uma lista:
fonte
Se você precisar repetir uma matriz, use o seguinte.
retornará
fonte
Outra linha:
fonte
Essa função cria uma matriz de elementos (comprimento) em que cada elemento é igual (valor) desde que (valor) seja um número inteiro ou sequência de caracteres de um número inteiro. Quaisquer números decimais serão truncados. Se você deseja números decimais, substitua "parseInt ( " por " parseFloat ( "
Exemplos:
fonte
Eu tive problemas com os métodos mencionados quando uso uma matriz como
Para conseguir isso, estou usando:
fonte
cycle
.Eu descobri isso hoje enquanto tentava fazer uma matriz 2D sem usar loops. Em retrospecto, juntar uma nova matriz é legal; Tentei mapear uma nova matriz, que não funciona, pois o mapa ignora os slots vazios.
O caracter "#" pode ser qualquer caractere único válido. O 5 seria uma variável para o número de elementos que você deseja. O 7 seria o valor com o qual você deseja preencher sua matriz.
O novo método de preenchimento é melhor e, quando codifiquei isso, não sabia que ele existia, nem sabia que repetir é es6; Vou escrever um post sobre como usar esse truque em conjunto com reduzir para fazer coisas legais.
http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/
fonte
Tente isto:
fonte
fonte
Se você estiver usando um cinto de utilidade como lodash / underscore, poderá fazê-lo assim :)
fonte
Também pode ser usado como uma linha:
fonte
Melhorando a resposta de Vivek , isso funciona para cadeias de qualquer comprimento, para preencher uma matriz de comprimento n:
Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)
fonte
Eu precisava de uma maneira de repetir / repetir uma matriz (com n itens) m vezes.
Por exemplo, distribuindo uma lista (de pessoas) para uma semana / mês. Digamos que eu tenho 3 nomes e quero que eles repitam em uma semana:
fonte