Существует ли более компактный способ сделать такую инициализацию?
for (var i = 0; i < arraySize; i++) array[i] = value;
Существует ли более компактный способ сделать такую инициализацию?
for (var i = 0; i < arraySize; i++) array[i] = value;
while(arraySize--) array.push(value);
нет инициализации (что я знаю)
Обновление
С тех пор, как вы отправили этот ответ 4 года назад, люди, похоже, продолжают возвращаться сюда для этого ответа. Для целей бенчмаркинга я сделал JSPerf с некоторыми различными решениями.
Решение выше здесь не самое быстрое, хотя оно и короткое. Чтобы придерживаться того же короткого стиля, но с лучшей производительностью:
while(size--) array[size] = value;
Обновление февраль 2016 Обновлен JSPerf с новой версией с большим количеством тестовых ящиков.
Если производительность не имеет значения, и вы хотите однострочный:
var value = 1234, // can be replaced by a fixed value
size = 1000, // can be replaced by a fixed value
array = Array.apply(null,{length: size}).map(function() { return value; });
Более эффективное решение (в одной, грязной, линии): Помните: это заменяет существующие значения, размер и переменные я в области
for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value;
Один короткий способ сделать это:
var arr = Array(arraySize).fill(value);
Сделал бы arr = Array [ 0, 0, 0, 0, 0 ]
, если arraySize == 5
и value == 0
, например.
Кажется, что после компактности в одноразовом сценарии эффективность ОП и повторного использования. Для других, ищущих эффективность, здесь оптимизация, о которой еще не упоминалось. Поскольку вы знаете длину массива заранее, продолжайте и установите его перед назначением значений. В противном случае массив будет многократно изменяться "на лету" - не идеально!
function initArray(length, value) {
var arr = [], i = 0;
arr.length = length;
while (i < length) { arr[i++] = value; }
return arr;
}
var data = initArray(1000000, false);
Это не так компактно, но, возможно, более прямое.
array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
Это вряд ли будет лучше, чем любой из вышеприведенных методов, но это весело...
var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})
Для эффективности я бы избегал push
. Так просто
for (var i = 0; i < arraySize; i++) array[i] = value;
Для IE10:
array = new Array(arraySize);
for (var i = 0; i < arraySize; i++) array[i] = value;
Изменить: изменено, как описано в комментариях.
Если вам нужно делать это много раз, вы всегда можете написать функцию:
function makeArray(howMany, value){
var output = [];
while(howMany--){
output.push(value);
}
return output;
}
var data = makeArray(40, "Foo");
И просто для полноты (возиться с прототипом встроенных объектов часто не очень хорошо):
Array.prototype.fill = function(howMany, value){
while(howMany--){
this.push(value);
}
}
Итак, теперь вы можете:
var data = [];
data.fill(40, "Foo");
Обновление: я только что видел вашу заметку о arraySize
как константу или литерал. Если это так, просто замените все while(howMany--)
на старые добрые for(var i=0; i<howMany; i++)
.
Наткнулся на это, исследуя методы массива на плоскости. Ох, места, куда мы идем, когда нам скучно.:)
var initializedArray = new Array(30).join(null).split(null).map(function(item, index){
return index;
});
.map()
и null
для победы! Мне нравится null, потому что переключение в строку типа вверх с "0" или любое другое значение сбивает с толку. Я думаю, что это более очевидно, что мы делаем что-то другое.
Обратите внимание, что .map()
пропускает неинициализированные значения. Вот почему new Array(30).map(function(item, index){return index});
не работает. Новый метод .fill()
является предпочтительным, если он доступен, однако поддержка браузера должна быть отмечена как 8/23/2015.
Рабочий стол (базовая поддержка)
Из MDN:
[1, 2, 3].fill(4); // [4, 4, 4]
[1, 2, 3].fill(4, 1); // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2); // [1, 4, 3]
[1, 2, 3].fill(4, 1, 1); // [1, 2, 3]
[1, 2, 3].fill(4, -3, -2); // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN); // [1, 2, 3]
Array(3).fill(4); // [4, 4, 4]
[].fill.call({ length: 3 }, 4); // {0: 4, 1: 4, 2: 4, length: 3}
Я думаю, что это красиво, коротко и элегантно
// assuming 'value' is what you want to fill the array with
// and 'arraySize' is the size of the array
Array(arraySize).fill(value);
var a=Array(100).join("|").split("|").map(Number);