Подтвердить что ты не робот

Инициализация массива с одним значением

Существует ли более компактный способ сделать такую ​​инициализацию?

for (var i = 0; i < arraySize; i++) array[i] = value;
4b9b3361

Ответ 1

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;

Ответ 2

Один короткий способ сделать это:

var arr = Array(arraySize).fill(value);

Сделал бы arr = Array [ 0, 0, 0, 0, 0 ], если arraySize == 5 и value == 0, например.

Ответ 3

Кажется, что после компактности в одноразовом сценарии эффективность ОП и повторного использования. Для других, ищущих эффективность, здесь оптимизация, о которой еще не упоминалось. Поскольку вы знаете длину массива заранее, продолжайте и установите его перед назначением значений. В противном случае массив будет многократно изменяться "на лету" - не идеально!

function initArray(length, value) {
    var arr = [], i = 0;
    arr.length = length;
    while (i < length) { arr[i++] = value; }
    return arr;
}

var data = initArray(1000000, false);

Ответ 4

Это не так компактно, но, возможно, более прямое.

array = Array.apply(null, new Array(arraySize)).map(function () {return value;});

Ответ 5

Это вряд ли будет лучше, чем любой из вышеприведенных методов, но это весело...

var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})

Ответ 6

Для эффективности я бы избегал 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; 

Изменить: изменено, как описано в комментариях.

Ответ 7

Если вам нужно делать это много раз, вы всегда можете написать функцию:

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++).

Ответ 8

Наткнулся на это, исследуя методы массива на плоскости. Ох, места, куда мы идем, когда нам скучно.:)

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.

Рабочий стол (базовая поддержка)

  • Chrome 45 (36 1)
  • Firefox (Gecko) 31 (31)
  • Internet Explorer не поддерживается
  • Opera не поддерживается
  • Safari 7.1

Из 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}

Ответ 9

Я думаю, что это красиво, коротко и элегантно

// assuming 'value' is what you want to fill the array with
// and 'arraySize' is the size of the array
Array(arraySize).fill(value);

Ответ 10

var a=Array(100).join("|").split("|").map(Number);