JavaScript에서 어레이를 비우려면 어떻게 해야 합니까?
수 있는 하다면 어레이를 비울 수 있는 방법이 있습니까?.remove()
예를 들어.
A = [1,2,3,4];
그걸 어떻게 비워요?
어레이를 A
:
방법 1
(이것이 질문에 대한 나의 원래 대답이었다)
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']
A.length = 0
기존 어레이의 길이를 0으로 설정하여 기존 어레이를 클리어합니다.일부에서는 이것이 JavaScript의 모든 구현에서 동작하는 것은 아니라고 주장하지만 실제로는 그렇지 않다는 것이 판명되었습니다.어레이의 길이 속성은 읽기/쓰기 속성이기 때문에 ECMAScript 5에서 "엄격한 모드"를 사용하는 경우에도 작동합니다.
방법 3(Anthony 제안)
A.splice(0,A.length)
「」를 사용합니다..splice()
완벽하게 동작할 것입니다만,.splice()
이 함수는 삭제된 모든 항목이 포함된 어레이를 반환합니다.실제로 원래 어레이의 복사본을 반환합니다.벤치마크에 따르면 이는 성능에 전혀 영향을 미치지 않습니다.
while(A.length > 0) {
A.pop();
}
이 솔루션은 매우 간결하지 않고 원래 답변에서 언급한 이전 벤치마크와 달리 가장 느린 솔루션이기도 합니다.
성능
기존 어레이를 클리어하는 모든 방법 중 메서드2와 3은 퍼포먼스가 매우 비슷하고 메서드4보다 훨씬 빠릅니다.이 벤치마크를 참조해 주세요.
아래 답변에서 Diadistis가 지적한 바와 같이, 위에서 설명한 4가지 방법의 성능을 결정하기 위해 사용된 원래 벤치마크에는 결함이 있었습니다.원래 벤치마크는 클리어된 어레이를 재사용했기 때문에 두 번째 반복에서는 이미 비어 있는 어레이를 클리어했습니다.
다음 벤치마크에서는 이 결함을 수정합니다.http://jsben.ch/ #/hyj65이는 방법 #2(길이 속성)와 방법 #3(스플라이스)이 가장 빠르다는 것을 명확하게 보여줍니다(원래 배열은 변경되지 않는 방법 #1을 세지 않음).
이것은 뜨거운 주제였고 많은 논란의 원인이었다.사실 정답이 많이 있는데, 이 정답은 오랫동안 정답으로 표기되어 있기 때문에 여기에 모든 방법을 포함하겠습니다.
업데이트해야 하는 어레이에 대한 다른 참조가 있기 때문에 원래 어레이를 유지해야 하는 경우 길이를 0으로 설정하여 새 어레이를 생성하지 않고 어레이를 지울 수 있습니다.
A.length = 0;
동일한 어레이('변동 가능')를 유지하면서 가장 빠르게 구현되는 구현:
function clearArray(array) {
while (array.length > 0) {
array.pop();
}
}
, 그것은 않다.while (array.pop())
: 스 : : : : : : : : : : 。
참고: 맵 및 세트 정의clear()
경우, 이치에 것으로 clear()
어레이도 마찬가지입니다.
TypeScript 버전:
function clearArray<T>(array: T[]) {
while (array.length > 0) {
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
jsPerf 오프라인.유사한 벤치마크: https://jsben.ch/hyj65
브라우저 은 보크 the the the will will will will를 사용하는 입니다.splice
어레이 A의 내용을 비우는 방법은 다음과 같습니다.
A.splice(0, A.length);
지금까지 2739표 이상의 업보트가 있는 답변은 오해의 소지가 있고 잘못된 답변입니다.
배열을 방법'입니다 '기존 배열을 비우는 방법').★★★★★★★★★★★★★★★★★,A = [1,2,3,4]
.
'아주먹다.
A = []
이 정답이다라는 것은 틀렸다.이것이 정답이다'라는 말은 무지하고 완전히 틀렸다.[] == []
거짓입니다.이는 이들 2개의 어레이가 각각 디지털 세계에서 공간을 차지하는 2개의 개별 객체이기 때문입니다.
엄마가 쓰레기통을 비우라고 하자.
- 부탁받은 일을 한 것처럼 새것을 들여오지 않는군요.
- 대신 쓰레기통을 비우세요.
- 새깡통으로 , 에서 '않고 새 .
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 배열의 내용을 올바르게 비우는 유일한 코드입니다.
퍼포먼스 테스트:
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 등)를 수정하지 않는 것이 좋다고 생각합니다.저는 동의하는 경향이 있습니다.취급 방법을 신중하게 결정해 주세요.
이를 위한 함수를 쉽게 만들거나 길이를 변경하거나 네이티브 어레이에 추가할 수 있습니다.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);
};
javascript 어플리케이션의 어레이를 비우기 위해 다음과 같이 호출할 수 있습니다.
arr.remove(); //[]
답변과 댓글 모두 팝/시프트 퍼포먼스에 대해 혼란과 오보가 많습니다.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
('하지 않음')[]
기존 어레이를 클리어하는 것이 아니라 가장 빠르지만 실제로 클리어하는 것은 아니기 때문입니다).
사용하시는 경우
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의 이전 답변과 같이 두 번째 방법이 더 빠릅니다.
Array.prototype.clear = function() {
this.length = 0;
};
그것을 불러라:array.clear();
메모리 할당에 관심이 있는 경우 Chrome 개발 툴의 타임라인 탭과 함께 이 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>
javascript는 오브젝트 배열은 말할 것도 없고 문자열을 다른 원시 유형과 다르게 관리하므로 배열 요소의 유형에 따라 달라질 수 있습니다.유형에 따라 발생하는 작업에 영향을 줄 수 있습니다.
A.splice(0);
지금 작업 중인 코드로 이 작업을 수행했습니다.어레이가 클리어 되었습니다.
상수를 사용하는 경우 다음과 같이 선택할 수 없습니다.
const numbers = [1, 2, 3]
재지정할 수 없습니다.
numbers = []
잘라낼 수 있는 것은 다음뿐입니다.
numbers.length = 0
Jan의 첫 번째 제안을 수정한 버전을 사용합니다.
var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
A.pop();
}
테서:
for (let i = A.length; i > 0;A.pop(),i--) {}
또 다른 방법은 다음과 같습니다.
while(!A[Symbol.iterator]().next().done)A.shift()
를 비우려면 'myArray.length = 0'
★★★★★★★★★★★★★★★★★」'myArray.pop() UN-till its length is 0'
length
: 언제든지 배열을 잘라내는 길이 속성을 설정할 수 있습니다.배열의 길이 속성을 변경하여 배열을 확장하면 실제 요소의 수가 증가합니다.pop()
: pop 메서드는 배열에서 마지막 요소를 제거하고 제거된 값을 반환하는 방법을 반환합니다.shift()
: shift 메서드는 0eth 인덱스에서 요소를 제거하고 연속 인덱스에서 값을 아래로 이동한 다음 제거된 값을 반환합니다.
예:
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);
아직 아무도 제안하지 않았다니 놀랍네요.
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);
}
}
언급URL : https://stackoverflow.com/questions/1232040/how-do-i-empty-an-array-in-javascript
'itsource' 카테고리의 다른 글
Python의 Panda와 NumPy+SciPy의 차이점은 무엇입니까? (0) | 2022.09.05 |
---|---|
webpack-cli 오류: 규칙 집합을 컴파일하지 못했습니다. (0) | 2022.09.04 |
사전 키를 사용할 수 없는 경우 기본값 반환 (0) | 2022.09.04 |
값이 변경된 값 및 열을 선택하십시오. (0) | 2022.09.04 |
프라이머리 키를 1000부터 시작하는 방법 (0) | 2022.09.04 |