초기화 - JavaScript로 배열을 비우는 방법은 무엇입니까?




자바 스크립트 array 초기화 (12)

Angular 2+ FormArray를 비우려면 아래에서 사용하십시오.

public emptyFormArray(formArray:FormArray) {
    for (let i = formArray.controls.length - 1; i >= 0; i--) {
        formArray.removeAt(i);
    }
}

배열을 비우고 .remove() 하면 가능합니까?

예를 들어,

A = [1,2,3,4];

어떻게 그걸 비울 수 있니?


기존 배열을 지우는 방법 A :

방법 1

(이 질문에 대한 내 원래의 대답이었다)

A = [];

이 코드는 변수 A 를 새로운 빈 배열로 설정합니다. 이것은 실제로 새로운 (빈) 배열을 생성하기 때문에 원래 배열 A 대한 참조 가 없으면 어디서나 참조를 갖지 않는 것이 좋습니다. 이 배열을 다른 변수 나 속성에서 참조한 경우 원래 배열은 변경되지 않으므로이 메서드는주의해야합니다. 원래 변수 A 로만 배열을 참조하는 경우에만 사용하십시오.

이것은 또한 가장 빠른 솔루션입니다.

이 코드 샘플은이 방법을 사용할 때 발생할 수있는 문제점을 보여줍니다.

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

방법 2 ( Matthew Crumley가 suggested 대로)

A.length = 0

길이를 0으로 설정하여 기존 배열을 지 웁니다. 일부는 JavaScript의 모든 구현에서 작동하지 않을 수도 있다고 주장하지만 일부에서는 이것이 사실이 아닙니다. 또한 배열의 길이 속성이 읽기 / 쓰기 속성이므로 ECMAScript 5에서 "strict mode"를 사용할 때도 작동합니다.

방법 3 ( Anthony suggested 대로)

A.splice(0,A.length)

.splice() 사용하면 완벽하게 작동하지만 .splice() 함수는 제거 된 항목이 모두있는 배열을 반환하므로 실제로 원래 배열의 복사본을 반환합니다. 벤치마킹은 이것이 성능에 아무런 영향을 미치지 않는다고 제안합니다.

방법 4 ( tanguy_k 에서 suggested tanguy_k )

while(A.length > 0) {
    A.pop();
}

이 솔루션은 그다지 간결하지 않으며 원래 응답에서 언급 된 이전 벤치 마크와는 달리 가장 느린 솔루션입니다.

공연

기존 배열 을 지우는 모든 방법 중에서 방법 2와 3은 성능면에서 매우 유사하며 방법 4보다 훨씬 빠릅니다.이 benchmark 참조하십시오.

아래의 answer 에서 Diadistis 가 지적한 것처럼 위에서 설명한 네 가지 방법의 성능을 결정하는 데 사용 된 원래 벤치 마크에는 결함이있었습니다. 원래 벤치 마크는 지워진 배열을 다시 사용하여 두 번째 반복은 이미 비어있는 배열을 지우는 것이 었습니다.

다음 벤치 마크는이 결함을 수정합니다 : benchmark . 방법 # 2 (길이 속성)과 # 3 (스플 라이스)이 가장 빠릅니다 (원래 배열을 변경하지 않는 방법 1을 계산하지 않음).

이것은 뜨거운 논쟁과 많은 논쟁의 원인이었습니다. 실제로 많은 정답이 있으며, 오랫동안이 대답이 인정 된 답변으로 표시 되었기 때문에 여기에 모든 방법이 포함됩니다. 이 답변에 투표하는 경우, 제가 언급 한 다른 대답을 upvote하십시오.


메모리 할당에 관심 이있는 경우이 도구와 함께 jsfiddle 와 같은 방법을 사용하여 Chrome 개발 도구의 타임 라인 탭을 비교할 수 있습니다. 하단의 휴지통 아이콘을 사용하여 배열을 지운 후에 가비지 콜렉션을 강제 실행하려고 할 것입니다. 이렇게하면 원하는 브라우저에 대해보다 명확한 답을 얻을 수 있습니다. 여기에 대한 많은 답변은 낡은 것이고 나는 그들에게 의존하지 않고 위의 @ tanguy_k의 답변 에서처럼 테스트합니다.

(앞서 언급 한 탭에 대한 소개는 here 확인할 수 here )

그래서 jsfiddle 복사 여기 강제로 :

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}
function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]="something"
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

자바 스크립트는 객체의 배열은 말할 것도없고 문자열을 다른 기본 유형과 다르게 관리하기 때문에 배열 요소의 유형에 따라 달라질 수 있습니다. 유형이 발생하면 영향을 미칠 수 있습니다.


배열을 "삭제"할 수 있도록이 파일을 JavaScript 파일에 추가 할 수 있습니다.

Array.prototype.clear = function() {
    this.splice(0, this.length);
};

그러면 다음과 같이 사용할 수 있습니다.

var list = [1, 2, 3];
list.clear();

또는 무언가를 파괴하지 않으려는 경우 :

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

많은 사람들은 네이티브 객체 (Array와 같은)를 수정하면 안된다고 생각하며, 동의 할 의향이 있습니다. 이 문제를 어떻게 처리할지 결정할 때주의하십시오.


사용중인 경우

a = []; 

그런 다음 이미 다른 변수에 할당 된 참조에 대해 새 배열 참조를 지정하면 해당 배열도 비어 있지 않으므로 가비지 수집기가 해당 메모리를 수집하지 않습니다.

예를 들어.

var a=[1,2,3];
var b=a;
a=[];
console.log(b);// It will print [1,2,3];

또는

a.length = 0;

a.length 를 지정할 때 배열의 경계를 재설정하고 나머지 배열 요소의 메모리는 가비지 수집기로 연결됩니다.

이 두 가지 솔루션 대신에 더 좋습니다.

a.splice(0,a.length)

while(a.length > 0) {
    a.pop();
}

kenshou.html의 이전 답변에 따르면 두 번째 방법이 더 빠릅니다.


상수를 사용한다면 선택의 여지가 없습니다.

const numbers = [1, 2, 3]

재배정 할 수 없습니다 :

numbers = []

자를 수 있습니다.

numbers.length = 0

아무도 아직 제안하지 않았다는 것에 놀랐습니다.

let xs = [1,2,3,4];
for (let i in xs)
    delete xs[i];

이렇게하면 다른 솔루션과 완전히 다른 상태의 배열이 만들어집니다. 어떤 의미에서 배열은 '비어있다':

xs
=> Array [ <4 empty slots> ]

[...xs]
=> Array [ undefined, undefined, undefined, undefined ]

xs.length
=> 4

xs[0]
=> ReferenceError: reference to undefined property xs[0]

[,,,,] 또는 Array(4) 사용하여 등가 배열을 생성 할 수 있습니다.


원본 배열을 업데이트해야하는 다른 참조가 있기 때문에 원본 배열을 유지해야하는 경우 길이를 0으로 설정하여 새 배열을 만들지 않고 원본 배열을 지울 수 있습니다.

A.length = 0;

지금까지 2739 개의 업 보트가없는 대답은 오해의 소지가 있거나 잘못되었습니다.

문제는 "기존 배열을 어떻게 비운가?"입니다. 예 : A = [1,2,3,4] .

  1. " A = [] 은 대답입니다"라고 말하는 것은 무식하고 절대적으로 부정확합니다. [] == []거짓 입니다.

    이는이 두 배열이 디지털 세계에서 각각 고유 한 공간을 차지하면서 자체적으로 두 개의 ID를 가진 두 개의 별개의 개별 객체이기 때문에 가능합니다.

어머니가 쓰레기통을 비우라고 엄마 한테하겠습니다.

  • 당신은 당신이 요구 한 것을 마치 한 것처럼 새로운 것을 가져 오지 않습니다.
  • 대신 휴지통을 비우십시오.
  • 채워진 캔을 새로운 빈 캔으로 교체하지 않고 채워진 캔에서 레이블 "A"를 가져 오지 않고 A = [1,2,3,4]; A = []; 같이 새 캔에 A = [1,2,3,4]; A = []; A = [1,2,3,4]; A = [];

배열 객체를 비우는 것이 가장 쉬운 방법입니다 :

A.length = 0;

이렇게하면 "A"아래의 깡통은 비어있을뿐만 아니라 새 것처럼 깨끗합니다.

  1. 또한, 깡통이 비어있을 때까지는 손으로 쓰레기를 버리실 필요가 없습니다! 다음과 같이 깡통이 비어있을 때까지 쓰레기를 수거하지 않도록 한 번에 완전히 기존의 것을 비우라고 요청 받았습니다.

    while(A.length > 0) {
        A.pop();
    }
    
  2. 왼손을 쓰레기통 바닥에 올려 놓고 오른쪽 상단을 잡고 그 내용물을 끌어낼 수있게하십시오.

    A.splice(0, A.length);
    

아니요, 당신은 그것을 비우라고했습니다 :

A.length = 0;

이것은 주어진 JavaScript 배열의 내용을 정확하게 비우는 유일한 코드입니다.


배열의 현재 메모리 위치를 비우려면 'myArray.length = 0' 또는 'myArray.pop() UN-till its length is 0'

  • length : 길이 속성을 설정하여 언제든지 배열을자를 수 있습니다. length 속성을 변경하여 배열을 확장하면 실제 요소 수가 증가합니다.
  • pop() : pop 메서드는 배열에서 마지막 요소를 제거하고 제거 된 값을 반환합니다.
  • shift() : shift 메서드는 0 번째 인덱스 에서 요소를 제거하고 연속 된 인덱스에서 값을 이동 한 다음 제거 된 값을 반환합니다.

예:

var arr = ['77'];
arr.length = 20;
console.log("Increasing : ", arr); // (20) ["77", empty × 19]
arr.length = 12;
console.log("Truncating : ", arr); // (12) ["77", empty × 11]

var mainArr = new Array();
mainArr = ['1', '2', '3', '4'];

var refArr = mainArr;
console.log('Current', mainArr, 'Refered', refArr);

refArr.length = 3;
console.log('Length: ~ Current', mainArr, 'Refered', refArr);

mainArr.push('0');
console.log('Push to the End of Current Array Memory Location \n~ Current', mainArr, 'Refered', refArr);

mainArr.poptill_length(0);
console.log('Empty Array \n~ Current', mainArr, 'Refered', refArr);

Array.prototype.poptill_length = function (e) {
  while (this.length) {
    if( this.length == e ) break;

    console.log('removed last element:', this.pop());
  }
};
  • Array Array Array constructor 또는 array literal 을 사용하여 새 메모리 위치로 Array를 만듭니다.

    mainArr = []; // a new empty array is addressed to mainArr.
    
    var arr = new Array('10'); // Array constructor
    arr.unshift('1'); // add to the front
    arr.push('15'); // add to the end
    console.log("After Adding : ", arr); // ["1", "10", "15"]
    
    arr.pop(); // remove from the end
    arr.shift(); // remove from the front
    console.log("After Removing : ", arr); // ["10"]
    
    var arrLit = ['14', '17'];
    console.log("array literal « ", indexedItem( arrLit ) ); // {0,14}{1,17}
    
    function indexedItem( arr ) {
        var indexedStr = "";
        arr.forEach(function(item, index, array) {
            indexedStr += "{"+index+","+item+"}";
            console.log(item, index);
        });
        return indexedStr;
    }
    
  • slice() : 슬라이스 함수를 사용하면 원래 배열에서 새로운 메모리 주소를 가진 요소의 얕은 복사본을 얻을 수 있으므로 cloneArr에 대한 수정은 실제 원래 배열에 영향을 미치지 않습니다.

    var shallowCopy = mainArr.slice(); // this is how to make a copy
    
    var cloneArr = mainArr.slice(0, 3); 
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    cloneArr.length = 0; // Clears current memory location of an array.
    console.log('Main', mainArr, '\tCloned', cloneArr);
    

동일한 배열 ( "변경 가능")을 유지 하면서 가장 빠른 작업 구현 :

Array.prototype.clear = function() {
  while (this.length) {
    this.pop();
  }
};

FYI Mapclear() 정의하므로 Array clear() 를 사용하는 것이 논리적 인 것처럼 보일 수도 있습니다.

또는 Underscore.js 믹스 인 :

_.mixin({
  clearArray: function(array) {
    while (array.length) {
      array.pop();
    }
  }
});

또는 간단한 함수 :

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

TypeScript 버전 :

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

참고로 while (array.pop()) 로 단순화 할 수 없습니다. 테스트가 실패합니다.

그리고 함께가는 테스트 :

describe('Array', () => {
  it('should clear the array', () => {
    let array = [1, 2, 3, 4, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);

    // Even with undefined or null inside
    array = [1, undefined, 3, null, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

여기 업데이트 된 jsPerf : http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152


Jan 의 초기 제안을 수정 한 버전을 사용하십시오.

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}




arrays