Programing

단일 값으로 배열 초기화

crosscheck 2020. 11. 23. 07:45
반응형

단일 값으로 배열 초기화


이런 종류의 초기화를 수행하는 더 간단한 방법이 있습니까?

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

while(arraySize--) array.push(value);

초기화 없음 (내가 알고있는)


최신 정보

4 년 전이 답변을 게시 한 이후로 사람들은이 답변을 위해 여기로 계속 돌아 오는 것 같습니다. 벤치마킹 목적 으로 몇 가지 다른 솔루션 으로 JSPerf만들었습니다 .

여기 위의 솔루션은 짧지 만 가장 빠르지는 않습니다. 동일한 짧은 스타일을 고수하지만 더 나은 성능을 유지하려면 :

while(size--) array[size] = value;

2016 년 2 월 업데이트 더 많은 테스트 케이스가 포함 된 새 개정판으로 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; });

보다 성능이 뛰어난 솔루션 (하나, 더티, 라인) :주의 : 이것은 스코프에 존재하는 값, 크기 및 i 변수를 대체합니다.

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 ]if arraySize == 5및을 만들 것 value == 0입니다.


OP는 효율성과 재사용 성보다 일회용 시나리오에서 소형화를 추구하는 것 같습니다. 효율성을 원하는 다른 사람들을 위해 아직 언급되지 않은 최적화가 있습니다. 배열의 길이를 미리 알고 있으므로 값을 할당하기 전에 설정하십시오. 그렇지 않으면 어레이의 크기가 즉시 반복적으로 조정됩니다. 이상적이지 않습니다!

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);})

나는 이것이 멋지고 짧고 우아하다고 생각합니다.

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

효율성을 위해 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");

And, just for completeness (fiddling with the prototype of built-in objects is often not a good idea):

Array.prototype.fill = function(howMany, value){
    while(howMany--){
        this.push(value);
    }
}

So you can now:

var data = [];
data.fill(40, "Foo");

Update: I've just seen your note about arraySize being a constant or literal. If so, just replace all while(howMany--) with good old for(var i=0; i<howMany; i++).


Stumbled across this one while exploring array methods on a plane.. ohhh the places we go when we are bored. :)

var initializedArray = new Array(30).join(null).split(null).map(function(item, index){
  return index;
});

.map() and null for the win! I like null because passing in a string like up top with '0' or any other value is confusing. I think this is more explicit that we are doing something different.

Note that .map() skips non-initialized values. This is why new Array(30).map(function(item, index){return index}); does not work. The new .fill() method is preferred if available, however browser support should be noted as of 8/23/2015.

Desktop (Basic support)

  • Chrome 45 (36 1)
  • Firefox (Gecko) 31 (31)
  • Internet Explorer Not supported
  • Opera Not supported
  • Safari 7.1

From 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}

참고URL : https://stackoverflow.com/questions/4049847/initializing-an-array-with-a-single-value

반응형