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

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

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

это быстрый/правильный способ выполнить задачу?

для n=100000; получил 15 мс.

Yurij 09.04.2019 07:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
2 799
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

Yurij 09.04.2019 07:32

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

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

console.info(arr);

Сделал быстрый JSPerf с ответом:

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

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

Yurij 09.04.2019 07:26

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

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

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

Yurij 09.04.2019 07:28

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

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

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

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

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

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

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

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

Другие вопросы по теме