배열을 비울 수있는 방법이 .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 (같은 제안 에 의해 매튜 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을 세지 않음)
이것은 화제가되고 논란의 원인이되었습니다. 실제로 많은 정답이 있으며이 답변이 오랫동안 허용 된 답변으로 표시되어 있으므로 여기에 모든 방법을 포함하겠습니다. 이 답변에 투표하면 내가 언급 한 다른 답변도 찬성하십시오.
답변
업데이트해야 할 다른 참조가 있기 때문에 원래 배열을 유지해야하는 경우 길이를 0으로 설정하여 새 배열을 만들지 않고 지울 수 있습니다.
A.length = 0;
답변
동일한 배열 을 유지 하면서 가장 빠르게 작동하는 구현 ( “변경 가능”) :
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
답변
브라우저 간 친숙하고 최적의 솔루션은 다음과 같이이 방법을 사용 splice
하여 배열 A의 내용을 비우는 것입니다.
A.splice(0, A.length);
답변
지금까지 2739 개 이상의 찬성 투표가 오해의 소지가 있거나 잘못되었습니다.
문제는 “기존 배열을 어떻게 비우나요?”입니다. 예를 들어 A = [1,2,3,4]
.
-
“말하기
A = []
답이다” 것은 무지하고 절대적으로 틀립니다.[] == []
이다 거짓 .이것은이 두 배열이 두 개의 분리 된 개별 개체이기 때문에 두 개의 고유 한 ID를 가지며 각각 디지털 세계에서 고유 한 공간을 차지하기 때문입니다.
엄마가 쓰레기통을 비우라고한다고 가정 해 봅시다.
- 요청한 것을 마치 마치 새로운 것을 가져 오지 않습니다.
- 대신 휴지통을 비 웁니다.
- 채워진 것을 새 빈 캔으로 교체하지 않고 채워진 캔에서 레이블 “A”를 가져 가지 않고 새 캔에 붙입니다.
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와 같은 기본 객체를 수정해서는 안된다고 생각하며 동의합니다. 처리 방법을 결정할 때주의하십시오.