[javascript] Javascript의 배열에서 빈 요소 제거

JavaScript의 배열에서 빈 요소를 어떻게 제거합니까?

간단한 방법이 있습니까, 아니면 반복해서 수동으로 제거해야합니까?



답변

편집 : 이 질문은 거의 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);

예를 들어 문자열을 처리하는 경우 “빈”것으로 간주되는 항목에 따라 위의 함수는 빈 문자열 인 요소를 제거하지 않습니다.

내가 자주 사용 참조하는 것이 하나 개의 전형적인 패턴이 요소를 제거하는 것입니다 falsy 빈 문자열을 포함, "", 0, NaN, null, undefined,와 false.

filter메소드, Boolean생성자 함수에 전달하거나 필터 기준 함수에서 동일한 요소를 리턴 할 수 있습니다 . 예를 들면 다음과 같습니다.

var filtered = array.filter(Boolean);

또는

var filtered = array.filter(function(el) { return el; });

두 가지 방법으로, filter첫 번째 경우 의 메소드는 Boolean생성자를 함수로 호출 하고 값을 변환하고 두 번째 경우에는 filter내부적으로 콜백의 리턴 값을 내재적으로 설정하기 때문에 작동 Boolean합니다.

스파 스 배열로 작업하고 “구멍”을 제거하려는 filter경우 true를 반환하는 콜백을 전달하는 메서드를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

옛 대답 : 이러지 마!

기본 Array 프로토 타입을 확장하여이 방법을 사용합니다.

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,,,,]);


답변

간단한 방법 :

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]

또는-( “text”유형의 단일 배열 항목 에만 해당 )

['','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

arr // [1,2,3,3,[],Object{},5,6]

jQuery를 통해 :

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

arr = $.grep(arr,function(n){ return n == 0 || n });

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]

업데이트-또 다른 빠르고 멋진 방법 (ES6 사용) :

var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,], 
    temp = [];

for(let i of arr)
    i && temp.push(i); // copy each non-empty value to the 'temp' array

arr = temp;

arr // [1, 2, 3, 3, 4, 4, 5, 6]

빈 값 제거

['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]


답변

모든 빈 값 ( “”, null, undefined 및 0)을 제거해야하는 경우 :

arr = arr.filter(function(e){return e}); 

빈 값과 줄 바꿈을 제거하려면

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

예:

arr = ["hello",0,"",null,undefined,1,100," "]
arr.filter(function(e){return e});

반환:

["hello", 1, 100, " "]

업데이트 (Alnitak의 의견에 근거)

경우에 따라 배열에 “0”을 유지하고 다른 항목 (null, undefined 및 “”)을 제거 할 수 있습니다.

arr.filter(function(e){ return e === 0 || e });

반환:

["hello", 0, 1, 100, " "]


답변

하나의 라이너 :

[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 이상을 가지고 있다면 Array.filter간단한 return true콜백 함수를 사용할 수 있습니다 .

arr = arr.filter(function() { return true; });

이후 .filter자동으로 원래의 배열 요소가 없기 때문에 생략합니다.

위에 링크 된 MDN 페이지에는 filter공식 버전을 지원하지 않는 JavaScript 인터프리터에서 사용할 수있는 오류 검사 버전도 포함되어 있습니다 .

이렇게하면 null항목이나 명시적인 undefined값을 가진 항목 은 제거되지 않지만 OP는 “누락 된”항목을 구체적으로 요청했습니다.


답변

구멍을 제거하려면

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

구멍 및 거짓 (널, 정의되지 않음, 0, -0, NaN, “”, false, document.all) 값을 제거하는 경우 :

arr.filter(x => x)

구멍, null 및 undefined를 제거하는 경우 :

arr.filter(x => x != null)

arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]


답변

깨끗한 방법입니다.

var arr = [0,1,2,"Thomas","false",false,true,null,3,4,undefined,5,"end"];
arr = arr.filter(Boolean);
// [1, 2, "Thomas", "false", true, 3, 4, 5, "end"]