#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 с ответом:
Комментарии:
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)
)