2012-05-04 3 views
18

Что является самым эффективным способом создания этого простого массива динамически.javascript - Создать простой динамический массив

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

Допустим, мы можем получить номер 10 из переменной

var mynumber = 10; 
+0

Хвостовая рекурсия будет любителю. – joshp

+0

@joshp хорошо он сказал «самый эффективный», поэтому я бы пошел с петлей: P –

+3

действительно ли вы хотите, чтобы эти числа сохранялись в виде строк? – BiAiB

ответ

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

не очень полезно расширять массив на каждом цикле, это почти неизбежно в большинстве случаев, но на этот раз мы знаем длину. (см. мои анны для получения дополнительной информации) – ajax333221

4

Похоже, вы просто хотите, чтобы построить массив, содержащий строковые варианты целочисленных значений. Простой подход:

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

Для более интересной версии вы могли бы сделать генератор ...

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

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

Было бы быстрее, если mynumber был локальным внутри функции хвоста. –

+0

Правда - хотя в какой-то момент я думал о диапазоне питона (START, STOP, STRIDE). – koblas

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

Это была моя первая мысль. Эффективный и лаконичный. –

+0

Может быть, быстрее присоединить/переразделить целочисленный массив в этих примерах, чем конвертировать по одному. например после циклов: 'arr = arr.join ('_'). split ('_');' и удалить шаги 'String ()'. –

0

Если вы спрашиваете, есть ли встроенный вещий range - подобный функция, нет. Вы должны сделать это грубо. Возможно, вам будет интересна rangy.

1

неверный вопрос, исправленный. Попробуйте:

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

Просто для удовольствия, если вы расширяете Array как это:

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

Вы могли бы использовать:

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

ok, Теперь я меняю 'mynumber = 100;' .. Пожалуйста, напишите длинную строку для меня. –

+0

См. Мое редактирование. Я думаю, что это не так эффективно с точки зрения циклов процессора, но это коротко. – KooiInc

+0

+1 от меня для холодного генератора. –

-2

таким же образом, вы бы для всех массивов вы хотите заполнить динамически. A для цикла. Suedo код

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

} 

, которые должны помочь вам на пути

+1

используйте 'var i', чтобы избежать глобальных привязок, используйте' new Array() 'или даже лучше' [] 'вместо' array() ', дайте' i' начальное значение, укажите индекс здесь 'arr [] =. ..', введите значения строк, диапазон неправильный (вам нужно использовать '<=' или отрегулировать диапазон, добавив +1 или что-то) – ajax333221

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

Это, кажется, быстрее в Chrome, по JSPerf, но обратите внимание, что это все очень браузер зависит.

Там в 4 вещи, которые вы можете изменить об этом фрагменте кода:

  1. Использование for или while.
  2. Используйте прямой или обратный цикл (с обратным созданием разреженного массива в начале)
  3. Используйте push или прямой доступ по индексу.
  4. Используйте неявное строчение или явно вызывайте toString.

В каждом браузере общая скорость будет сочетанием того, насколько лучше каждый параметр для каждого элемента в этом списке выполняется в этом конкретном браузере.

TL; DR: вероятно, не стоит пытаться микро-оптимизировать эту деталь.

+0

зачем дозировать переменную i начинать с 1, а не 0? –

+0

@JinnySong, вы прочитали вопрос? Он показывает массив, который начинается с '1 ''. –

8

Вот как я бы это сделать:

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

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

Мой ответ почти такой же всех, но учтите, что я сделал что-то другое:

  • Это лучше, если указать длина массива и не заставит его расширять каждый раз

Так что я создал массив с new Array(mynumber);

3

С ES2015, это может быть достигнуто сжато в одном выражении с использованием метода Array.from следующим образом:

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

Первый аргумент from представляет собой массив, как объект, который обеспечивает свойство длины. Второй аргумент - это функция карты, которая позволяет нам заменить значения по умолчанию undefined с их скорректированными значениями индекса по вашему запросу. Оформить заказ спецификация here

+0

одно можно упомянуть: вы можете использовать любое имя переменной вместо '_', первое свойство функции map представляет текущее значение элемента Arrays (arr [idx]). в этом примере он всегда «undefined» – Lusk116

2

Я бы сделал следующее:

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

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

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество своей должности. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода.Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! –