В Python, где [2]
находится список, следующий код дает такой вывод:
[2] * 5 # Outputs: [2,2,2,2,2]
Существует ли простой способ сделать это с помощью массива в JavaScript?
Я написал следующую функцию для этого, но есть что-то короче или лучше?
var repeatelem = function(elem, n){
// returns an array with element elem repeated n times.
var arr = [];
for (var i = 0; i <= n; i++) {
arr = arr.concat(elem);
};
return arr;
};
javascript
arrays
repeat
Curious2learn
источник
источник
Ответы:
Вы можете сделать это так:
Он удваивает массив в каждой итерации, поэтому он может создать действительно большой массив с несколькими итерациями.
Примечание: вы также можете значительно улучшить свою функцию, используя
push
вместоconcat
, так какconcat
будет создавать новый массив при каждой итерации. Вот так (показано только в качестве примера того, как вы можете работать с массивами):источник
arr = new Array(len);
, а затем назначить их по индексу в петле, то естьarr[i] = value;
. Таким образом, вы платите только O (n), а не перераспределяете массив по мере его роста. В общем, всегда лучше избегать растущих массивов, добавляя, когда это возможно. Если вы знаете окончательный размер, используйте его.Array.from({length:5}).map(x => 2)
В ES6 используется метод Array fill ()
источник
Array(5).fill([1,2,3]).flat()
. Обратите внимание, что flat () все еще очень экспериментальная, а поддержка браузера слабая.fill
вычисляется один раз, поэтому в массивеArray(9).fill(someMutable)
создается девять ссылокsomeMutable
(мутирует один, мутирует их все).источник
Array(...Array(10)).map(() => 5)
с оператором распространения или такжеArray.from(Array(10)).map(() => 5)
Array.from({length: 10}, () => 5);
lenght = 10
без перечисляемых свойств..map
работает только на перечисляемых свойствах..apply
Метод принимает этот массив, и отображает его вarguments array
(массив-подобный объект) , который будет передан вArray
функцию конструктора. Массив arguments не может быть разреженным, поэтому отсутствующие свойства устанавливаютсяundefined
и становятся перечисляемыми. Теперь мы можем использовать.map
какможешь попробовать:
Обновление (01/06/2018) :
Теперь вы можете повторять набор символов.
Примечание: Проверьте больше о заполнении (...) и from (...) для совместимости и поддержки браузера.
Обновление (05/11/2019) :
Другой способ, без использования
fill
илиfrom
, который работает для строки любой длины:источник
Array.from({length:5}, i => 1) // [1, 1, 1, 1, 1]
или создать массив с возрастающим значением
Array.from({length:5}, (e, i)=>i) // [0, 1, 2, 3, 4]
источник
Array.from({length:5}, i => 1)
=>i
is,undefined
поскольку он представляет пустое значениеArray.from({length:5}, (e, i)=>i)
=>e
is,undefined
поскольку он представляет пустое значение. Это должно бытьArray.from({length:5}, v => 1)
иArray.from({length:5}, (v, i)=>i)
В Лодаше все не так плохо
РЕДАКТИРОВАТЬ : Еще лучше:
РЕДАКТИРОВАТЬ : Еще лучше:
источник
[c] * n
можно записать как:Таким образом, для
[2] * 5
источник
Вы также можете расширить функциональность Array следующим образом:
Следует отметить, что расширение функциональности встроенных объектов может вызвать проблемы, если вы работаете со сторонними библиотеками. Всегда взвешивайте это в своих решениях.
источник
fill
каждый индекс в массиве, он будет ссылаться на один и тот же объект, поэтому изменение одного из них изменит их все. Это не так сложно решить, если это станет проблемой.if (!Array.prototype.fill) { }
В Node.js REPL:
источник
Array.from({length: 5}, x => 2);
ссылка https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Using_arrow_functions_and_Array.fromЕсли вам нужно повторить массив несколько раз:
вдохновленный этим ответом
источник
Нет проще. Вам нужно сделать цикл и вставить элементы в массив.
источник
push
лучше илиconcat
лучше, с точки зрения эффективности?Используйте эту функцию:
Или для более компактной версии:
Или для версии с карри:
Вы можете использовать эту функцию со списком:
источник
Если вам нужно повторить массив, используйте следующее.
вернется
источник
Еще один вкладыш:
источник
Эта функция создает массив элементов (length), где каждый элемент равен (value), если (value) является целым числом или строкой целого числа. Любые десятичные числа будут усечены. Если вам нужны десятичные числа, замените "parseInt ( " на " parseFloat ( ")
Примеры:
источник
У меня были проблемы с упомянутыми методами, когда я использую массив, как
Чтобы получить это я использую:
источник
cycle
.Я обнаружил это сегодня, пытаясь создать двумерный массив без использования циклов. Оглядываясь назад, можно сказать, что присоединение к новому массиву очень удобно; Я попытался отобразить новый массив, который не работает, так как карта пропускает пустые слоты.
Символ "#" может быть любым допустимым одиночным символом. 5 будет переменной для количества элементов, которые вы хотите. 7 будет значением, которым вы хотите заполнить ваш массив.
Новый метод заполнения лучше, и когда я его кодировал, я не знал, что он существует, и я не знал, что повторитель es6; Я собираюсь написать сообщение в блоге об использовании этого трюка в тандеме с «уменьшить», чтобы делать классные вещи.
http://jburger.us.to/2016/07/14/functionally-create-a-2d-array/
источник
Попробуй это:
источник
источник
Если вы используете пояс utlity, например, lodash / underscore, вы можете сделать это следующим образом :)
источник
Может использоваться как однострочник:
источник
Улучшение ответа Vivek , это работает для строк любой длины, чтобы заполнить массив длины n:
Array(n+1).join('[string to be repeated][separator]').split('[separator]').slice(0, n)
источник
Мне нужен был способ повторить / зациклить массив (с n элементов) m раз.
Например, распространение списка (лиц) на неделю / месяц. Допустим, у меня есть 3 имени, и я хочу их повторить через неделю:
источник