답변:
기존 배열을 지우는 방법 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 (같은 제안 에 의해 매튜 Crumley )
A.length = 0
길이를 0으로 설정하여 기존 배열을 지 웁니다. 일부는 이것이 모든 JavaScript 구현에서 작동하지 않을 수도 있다고 주장하지만, 그렇지 않은 것으로 밝혀졌습니다. 배열의 길이 속성은 읽기 / 쓰기 속성이므로 ECMAScript 5에서 "엄격 모드"를 사용할 때도 작동합니다.
A.splice(0,A.length)
사용 .splice()
은 완벽하게 작동하지만 .splice()
함수는 제거 된 모든 항목이 포함 된 배열을 반환하므로 실제로 원래 배열의 복사본을 반환합니다. 벤치 마크에서는 이것이 성능에 영향을 미치지 않는다고 제안합니다.
while(A.length > 0) {
A.pop();
}
이 솔루션은 간결하지 않으며 원래 답변에서 참조 된 이전 벤치 마크와 달리 가장 느린 솔루션입니다.
공연
기존 배열 을 지우는 모든 방법 중에서 방법 2와 3은 성능면에서 매우 유사하며 방법 4보다 훨씬 빠릅니다 . 이 벤치 마크를 참조하십시오 .
아래 답변 에서 Diadistis 가 지적한 것처럼 위에서 설명한 네 가지 방법의 성능을 결정하는 데 사용 된 원래 벤치 마크에 결함이있었습니다. 원래 벤치 마크는 지워진 배열을 재사용하여 두 번째 반복에서 이미 비어있는 배열을 지 웁니다.
다음 벤치 마크 수정이 결함 : http://jsben.ch/#/hyj65 . 그것은 방법 # 2 (길이 속성)와 # 3 (접합)이 가장 빠르다는 것을 분명히 보여줍니다 (원래 배열을 변경하지 않는 방법 # 1을 세지 않음)
이것은 화제가되고 논란의 원인이되었습니다. 실제로 많은 정답이 있으며이 답변이 오랫동안 허용 된 답변으로 표시되어 있으므로 여기에 모든 방법을 포함하겠습니다. 이 답변에 투표하면 내가 언급 한 다른 답변도 찬성하십시오.
while (A.length) { A.pop(); }
, 필요에> 0
> 0
더 읽기 쉬운 IMHO입니다. 그리고 둘 사이의 성능 차이는 없습니다.
b
배열 a
이 할당 된 후에도 이전 배열에 대한 참조를 보유합니다 . c
및 d
동일한 배열을 계속 참조. 따라서 출력의 차이가 예상됩니다.
while(A.pop())
배열의 항목이 잘못된 경우 사용할 수 없습니다 . 예를 들어 A = [2, 1, 0, -1, -2]를 사용하면 A는 [2, 1]과 같습니다. 심지어 while(A.pop() !== undefined)
값 중 하나로 정의되지 않은 당신은 배열을 가질 수 있기 때문에 작동하지 않습니다. 아마도 컴파일러가 최적화하지 않은 이유 일 것입니다.
업데이트해야 할 다른 참조가 있기 때문에 원래 배열을 유지해야하는 경우 길이를 0으로 설정하여 새 배열을 만들지 않고 지울 수 있습니다.
A.length = 0;
myarray.push(whatever)
하면 길이에 1이 추가됩니다. 따라서 길이를 설정하면 배열이 잘리지 만 영구적이지는 않습니다.
length
특별한 속성이지만 읽기 전용이 아니므로 여전히 작동합니다.
동일한 배열 을 유지 하면서 가장 빠르게 작동하는 구현 ( "변경 가능") :
function clearArray(array) {
while (array.length) {
array.pop();
}
}
참고로 단순화 할 수 없습니다 while (array.pop())
다음과 . 테스트가 실패합니다.
참고로 Map 및 Set define clear()
, Array에clear()
대해 논리적으로 보입니다. 도.
TypeScript 버전 :
function clearArray<T>(array: T[]) {
while (array.length) {
array.pop();
}
}
해당 테스트 :
describe('clearArray()', () => {
test('clear regular array', () => {
const array = [1, 2, 3, 4, 5];
clearArray(array);
expect(array.length).toEqual(0);
expect(array[0]).toEqual(undefined);
expect(array[4]).toEqual(undefined);
});
test('clear array that contains undefined and null', () => {
const array = [1, undefined, 3, null, 5];
clearArray(array);
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
Array.prototype
하고 약간 다른 일을 한 후 코드가 모든 전반에 걸쳐 [].clear()
약간 틀렸다. 이것은 디버깅하기에 재미 있지 않습니다. 따라서 일반적인 메시지는 다음과 같습니다. 전역을 수정하지 마십시오.
.splice()
및 보다 훨씬 느립니다 .length=0
. 벤치 마크가 올바르지 않습니다. 업데이트 된 답변을 참조하십시오.
브라우저 간 친숙하고 최적의 솔루션은 다음과 같이이 방법을 사용 splice
하여 배열 A의 내용을 비우는 것입니다.
A.splice(0, A.length);
splice
, 배열을 수정하고 삭제 된 항목을 반환합니다. 먼저 문서를 읽으십시오 : developer.mozilla.org/en-US/docs/JavaScript/Reference/…
A.splice(0, A.length),0;
. 이렇게하면 반환 값이 0
그대로 유지됩니다 A.length = 0;
. 결과 배열은 계속 생성 되므로 스크립트가 느리게 실행 되어야합니다 ( jsperf ~ 56 % 느림). 브라우저 구현이 splice
설정보다 더 빠를 이유 가 보이지는 않지만 이것에 영향을 미칩니다 length
.
A.splice(0)
또한 작동 한다는 것도 알았습니다 .
지금까지 2739 개 이상의 찬성 투표가 오해의 소지가 있거나 잘못되었습니다.
문제는 "기존 배열을 어떻게 비우나요?"입니다. 예를 들어 A = [1,2,3,4]
.
"말하기A = []
답이다" 것은 무지하고 절대적으로 틀립니다. [] == []
이다 거짓 .
이것은이 두 배열이 두 개의 분리 된 개별 개체이기 때문에 두 개의 고유 한 ID를 가지며 각각 디지털 세계에서 고유 한 공간을 차지하기 때문입니다.
엄마가 쓰레기통을 비우라고한다고 가정 해 봅시다.
A = [1,2,3,4]; A = [];
배열 객체를 비우는 것이 가장 쉬운 방법입니다.
A.length = 0;
이런 식으로 "A"아래의 캔은 비어있을뿐만 아니라 새 것처럼 깨끗합니다!
또한 캔이 비워 질 때까지 손으로 쓰레기를 제거 할 필요가 없습니다! 다음과 같이 캔을 비울 때까지 기존 쓰레기통을 완전히 비워달라고 요청했습니다.
while(A.length > 0) {
A.pop();
}
또한 왼손을 휴지통의 맨 아래에 놓고 맨 오른쪽을 잡고 다음과 같이 내용물을 꺼낼 수 있습니다.
A.splice(0, A.length);
아니요, 비워 달라는 요청을 받았습니다.
A.length = 0;
이것은 주어진 JavaScript 배열의 내용을 올바르게 비우는 유일한 코드입니다.
A(n) = A.splice( 0, A.length );
이전 컨텐츠를 백업해야하는 경우입니다. ps Array.length
는 기본적인 사실을 놓친 경우를 대비하여 읽기-쓰기 속성입니다. 즉, 길이를 새로운 길이로 확장하고, 원하는 길이로 잘라낼 수 없으며, 특히 길이를 0으로 줄임으로써 모든 멤버를 버릴 수 있습니다. 이것은 배열의 스위스 나이프입니다.
성능 테스트:
http://jsperf.com/array-clear-methods/3
a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length) // 97% slower
while (a.length > 0) {
a.pop();
} // Fastest
배열을 "삭제"할 수 있도록 이것을 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와 같은 기본 객체를 수정해서는 안된다고 생각하며 동의합니다. 처리 방법을 결정할 때주의하십시오.
clear
키가 포함되는 문제는 어떻습니까?
답변과 댓글 모두에서 팝 / 시프트 성능에 관한 많은 혼란과 잘못된 정보가 있습니다. while / pop 솔루션은 예상대로 최악의 성능을 제공 합니다. 실제로 일어나는 것은 스 니펫을 루프에서 실행하는 각 샘플에 대해 설정이 한 번만 실행된다는 것입니다. 예 :
var arr = [];
for (var i = 0; i < 100; i++) {
arr.push(Math.random());
}
for (var j = 0; j < 1000; j++) {
while (arr.length > 0) {
arr.pop(); // this executes 100 times, not 100000
}
}
올바르게 작동하는 새로운 테스트를 만들었습니다.
http://jsperf.com/empty-javascript-array-redux
경고 : 이 버전의 테스트에서도 어레이 복제에 대부분의 테스트 시간이 걸리므로 실제 차이를 확인할 수 없습니다. 여전히 splice
배열을 지우는 가장 빠른 방법 임을 보여줍니다 ( []
가장 빠르지 만 실제로 기존 배열을 지우지 않기 때문에 고려하지 않음).
메모리 할당에 관심이있는 경우 크롬 개발자 도구의 타임 라인 탭 과 함께이 jsfiddle 과 같은 것을 사용하여 각 접근 방식을 비교할 수 있습니다 . 어레이를 '지운'후 가비지 콜렉션을 강제 실행하려면 맨 아래에있는 휴지통 아이콘을 사용하려고합니다. 이것은 당신이 선택한 브라우저에 대해 더 확실한 대답을 줄 것입니다. 여기에 많은 답변이 오래되어 있으며 그들에게 의존하지 않고 위의 @tanguy_k의 답변에서와 같이 테스트합니다.
Stackoverflow는 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>
자바 스크립트는 객체 배열을 언급하지 않고 다른 기본 유형과 다르게 문자열을 관리하므로 배열 요소의 유형에 따라 달라질 수 있습니다. 유형에 따라 달라질 수 있습니다.
당신은 쉽게 당신을 위해 그렇게 변경하는 기능을 만들 수 있습니다 길이 또는에 추가 네이티브 배열 로 remove()
재사용 기능을.
이 배열이 있다고 상상해보십시오.
var arr = [1, 2, 3, 4, 5]; //the array
좋아, 그냥 이것을 실행하십시오 :
arr.length = 0; //change the length
결과는 다음과 같습니다.
[] //result
배열을 비우는 쉬운 방법 ...
또한 루프가 필요하지 않지만 다른 방법으로 사용할 수 있습니다.
/* could be arr.pop() or arr.splice(0)
don't need to return as main array get changed */
function remove(arr) {
while(arr.length) {
arr.shift();
}
}
예를 들어 다음과 같이 생각할 수있는 까다로운 방법이 있습니다.
arr.splice(0, arr.length); //[]
따라서 arr에 5 개의 항목이 있으면 0에서 5 개의 항목을 스 플라이 싱하므로 배열에 아무것도 남지 않습니다.
또한 단순히 배열을 다시 할당하는 것과 같은 다른 방법도 있습니다.
arr = []; //[]
배열 함수를 보면 다른 방법이 많이 있지만 가장 권장되는 방법은 길이를 변경하는 것입니다.
처음에 말했듯이 remove ()는 질문에 대한 답변이므로 프로토 타입을 만들 수도 있습니다. 위의 방법 중 하나를 선택하고 JavaScript로 Array 객체로 프로토 타입을 만들 수 있습니다.
Array.prototype.remove = Array.prototype.remove || function() {
this.splice(0, this.length);
};
그리고 자바 스크립트 응용 프로그램에서 배열을 비우려면 다음과 같이 간단히 호출 할 수 있습니다.
arr.remove(); //[]
Array.prototype.clear = function() {
this.length = 0;
};
그리고 그것을 부르십시오 : array.clear();
A.splice(0);
방금 작업중 인 일부 코드 에서이 작업을 수행했습니다. 배열이 지워졌습니다.
당신이 사용하는 경우
a = [];
그런 다음 a의 참조가 이미 다른 변수에 할당 된 경우 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의 이전 답변에 따르면 두 번째 방법이 더 빠릅니다.
a.length
새로운 답변이 스레드에 추가하는 것을 보지 못합니까?
a.length=0;
수행 할 때 어떤 JS 엔진이 새로운 배열을 생성하는지 확인할 소스 가 있습니까? 어떻게 그 엔진에 대한 행동 것 a.length=500;
와 a.length=4;
?
var a = [1]; var b = a; a.length = 0; console.log(b)
prints Array [ ]
이므로 나에게 새로운 배열을 만드는 것처럼 보이지 않습니다.
어레이의 현재 메모리 위치를 비우려면 다음을 사용하십시오. 'myArray.length = 0'
또는'myArray.pop() UN-till its length is 0'
length
: 언제든지 배열을 자르도록 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());
}
};
new Array() | []
사용하여 새로운 메모리 위치에 배열을 만들 Array constructor
거나 array literal
.
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);
length = ?
그냥 대신 말했을 것입니다 length
.
아무도 아직 이것을 제안하지 않은 것에 놀랐습니다.
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)
Angular 2+ FormArray를 비우려면 아래를 사용하십시오.
public emptyFormArray(formArray:FormArray) {
for (let i = formArray.controls.length - 1; i >= 0; i--) {
formArray.removeAt(i);
}
}