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

#javascript #arrays #numbers

#javascript #массивы #числа

Вопрос:

на данный момент я использую этот JavaScript для создания массива с n числами от 0 до n

 // javascript populate array 
var n=1000;
var arr=[n];
for (i=n;i>=0;i--) {
arr[i]=i;
console.log(arr[i]);
} 

  

является ли это быстрым / правильным способом выполнения задачи?

Комментарии:

1. для n = 100000; получено 15 мс.

Ответ №1:

Вы можете использовать декларативный подход при использовании Array.from следующим образом:

 arr = Array.from({length: 20}, (e, i)=> i)
console.log(arr)  

Комментарии:

1. просто так же быстро, как метод итерации цикла 25 против 15. мс с n = 100000

2. Можете ли вы подробнее рассказать о том, как это работает? Я прочитал документацию MDN, но мне нужен ELI5. Как работает {длина: 20} и как мне это посмотреть?

3. @pmath325 В разделе Описание в MDN: array-like objects (objects with a length property and indexed elements). Вы создаете новый объект со свойством длины, как требуется (т. Е.-20): Array.from просматривает это свойство длины и пытается проиндексировать объект для каждого индекса по длине (0 … 19). Он становится неопределенным как значение в каждом индексе и передает (значение, индекс) функции arrow. Затем функция arrow возвращает индекс, который собирается Array.from .

Ответ №2:

Способ ES6 сделать это с помощью Array.keys() :

 let n = 10;
let arr = Array.from(Array(n).keys());

console.log(arr);  


Пока что сделал быстрый JSPerf с ответом:

https://jsperf.com/array-filling-so/

Комментарии:

1. существует большой разброс значений длительности по времени от 19 мс до 50 мс. но это просто быстрый метод. (n= 1000000);

Ответ №3:

Вы можете использовать функцию, map пропускающую первый параметр предиката и получающую индекс i .

 let arr = Array(10).fill().map((_, i) => i);
console.log(arr);  

Комментарии:

1. короткий, но медленный. ~ 35 мс против 15 мс

Ответ №4:

Если под эффективным вы подразумеваете ‘наименьшее количество символов’, я думаю, что это короче, чем любой из опубликованных ответов:

 [...Array(10).keys()]
  

Подобные вещи пригодятся при тестировании материалов с помощью консоли браузера. Имейте в виду, однако, что это более чем в два раза медленнее, чем принятый в настоящее время ответ:

 Array.from({length:10},(e,i)=>i)
  

Хотя я профессионально не тестировал производительность, я попытался создать массив с элементами 1e8, используя оба метода, и это заняло около пяти секунд при использовании первого метода и всего двух при использовании второго метода (со значительной вариативностью для обоих методов) на моем маленьком ноутбуке, тогда как массив с элементами 1e9 привел к нехватке памяти.

Но для людей, которым необходимо регулярно вводить подобные данные в консоль браузера, это может не иметь такого значения, как простота запоминания и ввода. Обратите внимание, однако, что если вы собираетесь сразу передать результат в .map() первый метод короче всего на один символ, а производительность будет еще хуже по сравнению, особенно потому, что второй метод не требует отдельного .map() вызова. Итак, только для отладки или тестирования, но, на мой взгляд, все еще полезно.

Ответ №5:

Array.from(Array(1000).keys()); Пока что это самый быстрый движок v8. Не слушайте другое. https://jsbench.me/jdjxrdszul/2

Ответ №6:

Самый короткий способ (я думаю) [...Array(10)].map((a,b)=>b)

 console.log(
  [...Array(10)].map((a,b)=>b)
)