Каков наиболее эффективный способ создания этого простого массива динамически.
var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
Скажем, мы можем получить число 10 от переменной
var mynumber = 10;
Каков наиболее эффективный способ создания этого простого массива динамически.
var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
Скажем, мы можем получить число 10 от переменной
var mynumber = 10;
var arr = [];
for(var i=1; i<=mynumber; i++) {
arr.push(i.toString());
}
Вот как я это сделаю:
var mynumber = 10;
var arr = new Array(mynumber);
for (var i = 0; i < mynumber; i++) {
arr[i] = (i + 1).toString();
}
Мой ответ почти одинаковый для всех, но обратите внимание, что я сделал что-то другое:
Итак, я создал массив с new Array(mynumber);
С ES2015 это можно сделать кратко в одном выражении с Array.from
метода Array.from
например:
Array.from({ length: 10 }, (_, idx) => '${++idx}')
Первым аргументом from
является объект, похожий на массив, который предоставляет свойство length. Второй аргумент - это функция карты, которая позволяет нам заменять undefined
значения по умолчанию их скорректированными значениями индекса по вашему запросу. Проверьте спецификацию здесь
Похоже, вы просто хотите построить массив, содержащий строковые версии целочисленных значений. Простой подход:
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);
var arr = [];
while(mynumber--) {
arr[mynumber] = String(mynumber+1);
}
Я бы сделал следующее:
var num = 10,
dynar = [...Array(num)].map((_,i) => ++i+"");
console.log(dynar);
неправильно прочитал вопрос, исправил. Попробуйте:
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;});
Этот ответ о "как динамически создать массив без цикла ".
Литеральный оператор []
не позволяет нам создавать динамически, поэтому давайте посмотрим на Array
, его конструктор и его методы.
В ES2015 Array есть метод .from()
, который легко позволяет нам создавать динамический Array:
Array.from({length: 10}) // -> [undefined, undefined, undefined, ... ]
Когда конструктор Array получает число в качестве первого параметра, он создает массив с размером этого числа, но он не повторяется, поэтому мы не можем использовать .map()
, .filter()
и т. .filter()
.:
new Array(10) // -> [empty × 10]
Но если мы передадим более одного параметра, мы получим массив из всех параметров:
new Array(1,2,3) // -> [1,2,3]
Если бы мы использовали ES2015, мы могли бы использовать оператор распространения, который будет распространять пустой массив внутри другого массива, поэтому мы получим итеративный массив:
[...new Array(10)] // -> [undefined, undefined, undefined, ...]
Но если мы не используем ES2015 и не имеем полизаполнения, в ES5 также есть способ создать динамический массив без цикла. Если мы подумаем о .apply()
: он распространяет массив второго аргумента на params. Таким образом, вызов apply для конструктора Array поможет:
Array.apply(null, new Array(10)) // -> [undefined, undefined, undefined, ...]
После того, как у нас есть динамический итерируемый массив, мы можем использовать карту для назначения динамических значений:
Array.apply(null, new Array(10)).map(function(el, i) {return ++i + ""})
// ["1","2","3", ...]
Если вы спрашиваете, есть ли встроенная функция Pythonic range
-like, это не так. Вы должны сделать это грубо. Может быть, rangy будет вам интересен.
var arr = [];
for(var i=1; i<=mynumber; i++) {
arr.push("" + i);
}
В Chrome, похоже, быстрее, в соответствии с JSPerf, но учтите, что все зависит от браузера.
Есть 4 вещи, которые вы можете изменить в этом фрагменте:
for
или while
.push
или прямой доступ по индексу.toString
.В каждой обозревателе общая скорость будет сочетанием того, насколько лучше каждый параметр для каждого элемента в этом списке выполняется в этом конкретном браузере.
TL; DR: вероятно, не стоит пытаться микро-оптимизировать эту часть.
У меня была похожая проблема, и решение, которое я нашел (забыл, где я нашел это), это:
Array.from(Array(mynumber), (val, index) => index + 1)
Я надеюсь, что вы должны получить последний элемент из переменной массива, так что мое решение
var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
var mynumber = arr [arr .length - 1];
//var mynumber = 10;
То же самое, что и для всех массивов, которые вы хотите заполнить динамически. A для цикла. Код suedo
arr =array()
for(i; i<max; i++){
arr[]=i
}
который должен помочь вам на пути