JavaScript 배열에서 빈 요소를 제거하려면 어떻게 해야 합니까?
간단한 방법이 있습니까?아니면 루프를 반복하여 수동으로 제거해야 합니까?
질문에 대한 답변
몇 가지 간단한 방법:
var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];
arr.filter(n => n) // [1, 2, 3, -3, 4, 4, 5, 6]
arr.filter(Number)
// [1, 2, 3, -3, 4, 4, 5, 6]
arr.filter(Boolean)
// [1, 2, 3, -3, 4, 4, 5, 6]
또는 – (“텍스트” 유형의 단일 배열 항목만 해당)
['','1','2',3,,'4',,undefined,,,'5'].join('').split('');
// output:
["1","2","3","4","5"]
또는 – 기존 방식: 단순 반복
var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
len = arr.length, i;
for(i = 0; i < len; i++ )
arr[i] && arr.push(arr[i]);
// copy non-empty values to the end of the array
arr.splice(0 , len);
// cut the array and leave only the non-empty values // [1,2,3,3,[],Object{},5,6]
j쿼리:
var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];
arr = $.grep(arr, n => n == 0
n); // [1, 2, 3, 3, 0, 4, 4, 5, 6]
편집: 이 질문은 거의 9년 전에 답변되었습니다.그때, 이 질문에 대한 답변은 도움이 되는 임베디드 메서드가 거의 없었습니다.Array.prototype
.
이제, 확실히, 저는 당신에게 이 기능을 사용할 것을 권합니다.filter
방법.
이 메서드는 제공하는 콜백 함수의 기준을 충족하는 요소를 포함하는 새 어레이를 반환합니다.
예를 들어 제거하려는 경우null
또는undefined
값:
var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];
var filtered = array.filter(function (el) {
return el != null; });
console.log(filtered);
예를 들어 문자열을 취급하는 경우 위의 함수는 빈 문자열인 요소를 제거하지 않습니다.
자주 사용되는 패턴 중 하나는 빈 스트링을 포함한 가짜 요소를 제거하는 것입니다.""
,0
,NaN
,null
,undefined
,그리고.false
.
에 패스할 수 있습니다.filter
메서드,Boolean
생성자 함수 또는 필터 기준 함수에서 동일한 요소를 반환합니다. 예를 들어 다음과 같습니다.
var filtered = array.filter(Boolean);
또는
var filtered = array.filter(function(el) { return el; });
어느 쪽이든, 이것은 동작합니다.filter
첫 번째 경우 메서드,Boolean
값을 변환하는 함수로서의 생성자, 그리고 두 번째 경우,filter
method는 콜백의 반환값을 암묵적으로 에 반환합니다.Boolean
.
스파스 어레이를 사용하여 “구멍”을 제거하려는 경우filter
true를 반환하는 콜백을 전달하는 메서드.다음은 예를 제시하겠습니다.
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
오래된 답변:이러지 마!
이 방법을 사용하여 네이티브 어레이 프로토타입을 확장합니다.
Array.prototype.clean = function(deleteValue) {
for (var i = 0; i < this.length; i++) {
if (this[i] == deleteValue) {
this.splice(i, 1);
i--;
}
}
return this; };
test = new Array("", "One", "Two", "", "Three", "", "Four").clean(""); test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]; test2.clean(undefined);
또는 기존 요소를 다른 배열로 푸시할 수도 있습니다.
// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string) function cleanArray(actual) {
var newArray = new Array();
for (var i = 0; i < actual.length; i++) {
if (actual[i]) {
newArray.push(actual[i]);
}
}
return newArray; }
cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
모든 빈 값(“), null, defined 및 0)을 제거해야 하는 경우:
arr = arr.filter(function(e){return e});
빈 값과 줄 바꿈을 제거하려면:
arr = arr.filter(function(e){ return e.replace(/(rn n r)/gm,"")});
예:
arr = ["hello",0,"",null,undefined,1,100," "]
arr.filter(function(e){return e});
반품:
["hello", 1, 100, " "]
UPDATE (Alnitak의 코멘트에 근거)
경우에 따라 어레이에 “0”을 유지하고 다른 항목(null, undefined 및 “)을 삭제할 수 있습니다.이 방법은 다음과 같습니다.
arr.filter(function(e){ return e === 0
e });
반품:
["hello", 0, 1, 100, " "]
라이너 1개만:
[1, false, "", undefined, 2].filter(Boolean); // [1, 2]
또는 underscorejs.org 를 사용합니다.
_.filter([1, false, "", undefined, 2], Boolean); // [1, 2] // or even: _.compact([1, false, "", undefined, 2]); // [1, 2]
Javascript 1.6 이후를 사용하고 있는 경우, 간단한 사용법을 사용할 수 있습니다.return true
콜백 함수. 예:
arr = arr.filter(function() { return true; });
부터.filter
는 원래 배열에서 누락된 요소를 자동으로 건너뜁니다.
위에 링크된 MDN 페이지에는 다음 버전의 오류 체크도 포함되어 있습니다.filter
정식 버전을 지원하지 않는 JavaScript 인터프리터에서 사용할 수 있습니다.
이렇게 해도 제거되지 않습니다.null
엔트리와 명시적인 엔트리가 있습니다.undefined
OP가 특별히 “누락된” 엔트리를 요청했습니다.