2012-05-04 17 views
18

¿Cuál es la forma más eficiente de crear esta matriz simple dinámicamente?javascript - Crear matriz dinámica simple

var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]; 

Digamos que podemos obtener el número 10 de una variable

var mynumber = 10; 
+0

recursión de cola sería más elegante. – joshp

+0

@joshp bien dijo "más eficiente" así que iría con un bucle for: P –

+3

¿realmente desea que esos números se almacenen como cadenas? – BiAiB

Respuesta

41
var arr = []; 
for(var i=1; i<=mynumber; i++) { 
    arr.push(i.toString()); 
} 
+0

no es muy saludable expandir la matriz en cada ciclo, esto es casi inevitable la mayor parte del tiempo, pero esta vez sabemos la longitud. (ver mi ans para más información) – ajax333221

4

Suena como lo que desea es construir una matriz que contiene las versiones de cadena de los valores enteros. Un enfoque simple:

var arr = []; 
for (var i = 1; i <= mynumber; i++) arr.push(""+i); 

Para una versión más interesante que podría hacer un generador ...

function tail(i, maxval) { 
    return [i].concat(i < maxval ? tail(i+1, maxval) : []); 
} 

var arr = tail(1, mynumber); 
+0

Sería más rápido si mi número fuera local dentro de la función de cola. –

+0

Es cierto, aunque en un momento estuve pensando en la función de rango de python (START, STOP, STRIDE). – koblas

2
var arr = []; 
while(mynumber--) { 
    arr[mynumber] = String(mynumber+1); 
} 
+0

Este fue mi primer pensamiento. Eficiente y conciso. –

+0

Podría ser más rápido unir/volver a dividir la matriz de enteros en estos ejemplos que convertir uno a la vez. p.ej. después de los bucles: 'arr = arr.join ('_'). split ('_');' y eliminar los pasos 'String ()'. –

0

Si se está preguntando si hay una construida en Pythonic range - como la función, no hay. Tienes que hacerlo de la manera de la fuerza bruta. Tal vez rangy sería de su interés.

1

malinterpretó la pregunta, corregida. Proveedores:

var myNumber = 100, 
    myarr = (function arr(i){return i ? arr(i-1).concat(i) : [i]}(myNumber)); 

Sólo por diversión, si extiende Array así:

Array.prototype.mapx = function(callback){ 
    return String(this).split(',').map(callback); 
} 

que puede usar:

var myNum = 100, 
    myarr = new Array(myNum).mapx(function(el,i){return i+1;}); 
+1

ok, ahora cambio 'mynumber = 100;' .. Por favor escriba la cadena larga para mí. –

+0

Ver mi edición. No es tan eficiente en términos de ciclos de CPU, supongo, pero es corto. – KooiInc

+0

+1 de mi por el generador genial. –

-2

la misma forma que lo haría para todas las matrices que desea rellenar dinamicamente. A para bucle. código Suedo es

arr =array() 
for(i; i<max; i++){ 
arr[]=i 

} 

que debería ayudar en el camino

+1

use 'var i' para evitar las globales, use' new Array() 'o mejor' (] 'en lugar de' array() ', dé' i' un valor inicial, especifique un índice aquí 'arr [] =. ..', haga las cadenas de valores, el rango no es correcto (debe usar '<=' o ajustar el rango agregando +1 o algo) – ajax333221

0
var arr = []; 
for(var i=1; i<=mynumber; i++) { 
    arr.push("" + i); 
} 

Ésta parece ser más rápido en Chrome, de acuerdo con JSPerf, pero tenga en cuenta que es muy dependiente del navegador.

Hay 4 cosas que se pueden cambiar sobre este fragmento:

  1. Uso for o while.
  2. Uso hacia adelante o bucle hacia atrás (con hacia atrás array crear escasa al inicio)
  3. Uso push o acceso directo por el índice.
  4. Usar una cadena de caracteres implícita o llamar explícitamente al toString.

En todas y cada una velocidad total de navegador habría combinación de lo mucho mejor que cada opción para cada elemento de la lista que se presenta en navegador en particular.

TL; DR: probablemente no sea una buena idea tratar de optimizar esta pieza en particular.

+0

¿por qué dosificar la variable empiezo con 1 en lugar de 0? –

+0

@JinnySong, ¿leyó la pregunta? Muestra una matriz que comienza con '" 1 "'. –

8

Aquí es cómo lo haría:

var mynumber = 10; 
var arr = new Array(mynumber); 

for (var i = 0; i < mynumber; i++) { 
    arr[i] = (i + 1).toString(); 
} 

Mi respuesta es más o menos lo mismo de todos, pero en cuenta que yo hice algo diferente:

  • Es mejor si se especifica la longitud de la matriz y no obligan a que se expanda cada vez que

Así que creé la matriz con new Array(mynumber);

3

Con ES2015, esto se puede lograr de manera concisa en una sola expresión utilizando el método de Array.from así:

Array.from({ length: 10 }, (_, idx) => `${++idx}`) 

El primer argumento de from es una matriz como objeto que proporciona una propiedad de longitud. El segundo argumento es una función de mapa que nos permite reemplazar los valores predeterminados de undefined con los valores de índice ajustados que usted solicitó. Verifique la especificación here

+0

Una cosa para mencionar: puede usar cualquier nombre de variable en lugar de '_', la primera propiedad de la función de mapa representa el valor actual del elemento Arrays (arr [idx]). en este ejemplo, siempre está "indefinido" – Lusk116

2

Haría de la siguiente manera;

var num = 10, 
 
    dynar = [...Array(num)].map((_,i) => ++i+""); 
 
console.log(dynar);

0
Array.apply(null, new Array(10)).map((el, i) => ++i + "") 
+4

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de tu publicación Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código.Por favor, intente no saturar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones! –

Cuestiones relacionadas