특정 배열 인덱스에 값이 있는지 JavaScript를 어떻게 확인합니까?


521

"index"위치의 값이 존재하는지 또는 더 나은 방법이 있는지 테스트하는 데 도움이됩니까?

if(arrayName[index]==""){
     // do stuff
}

6
전체 배열이 비어 있는지 확인하고 싶지 않고 인덱스 값이 "index"인 특정 위치
Ankur

제목은 "특정 배열 인덱스에 값이 존재하는 경우 JavaScript를 어떻게 확인합니까"라고 말하면 개선 될 수 있습니다.
demisx

답변:


738

개념적으로 JavaScript의 배열에는 까지 array.length시작하는 요소가 포함 됩니다. 인덱스 가 있는 배열 요소 는 배열 사이 에 포함 된 경우 배열의 일부로 정의됩니다 . 이 범위에 속하지 않으면 배열에 없습니다.array[0]array[array.length - 1]ii0array.length - 1

따라서 개념적으로 배열은 항목이없는 해당 범위 내에 "갭"을 갖지 않는 메커니즘없이 0부터 시작하여 최대 값까지 선형입니다. 주어진 위치 인덱스 (값이 0 또는 양의 정수)에 값이 있는지 확인하려면 문자 그대로

if (i >= 0 && i < array.length) {
  // it is in array
}

이제 JavaScript 엔진은 동적 언어에서는 의미가 없으며 특정 코드에는 비효율적이므로 거의 확실하게 배열 공간을 선형 및 연속적으로 할당하지 않습니다. 아마도 해시 테이블이거나 전략의 하이브리드 혼합 일 수 있으며 정의되지 않은 범위의 배열에는 자체 메모리가 할당되지 않았을 수 있습니다. 그럼에도 불구하고, JavaScript는 array.length n 개의 배열을 n 개의 멤버 를 갖는 것으로 제시하기를 원하며 이름은 0 ~ n-1입니다. ,이 범위에서 아무것도 배열의 일부입니다.

당신은 아마 원하는 것은, 그러나, 배열에 값이 있는지 알고있다 정의 뭔가 실제로 , 그것은 아니다 - undefined. 아마도 정의되어 있고 아닌지null 알고 싶을 수도 있습니다 . 값을 설정하지 않고 배열에 멤버를 추가 할 수 있습니다. 예를 들어 array.length속성 을 증가시켜 배열 값을 추가하는 경우 새 값은입니다 undefined.

주어진 값이 의미가 있는지 또는 정의되었는지 확인 즉 , 또는 아닙니다 .undefinednull

if (typeof array[index] !== 'undefined') {

또는

if (typeof array[index] !== 'undefined' && array[index] !== null) {

흥미롭게도 JavaScript의 비교 규칙으로 인해 마지막 예제는 다음과 같이 최적화 될 수 있습니다.

if (array[index] != null) {
  // The == and != operators consider null equal to only null or undefined
}  

6
OP는 어떤 종류의 배열을 다루고 있는지를 알고 있지만 완전성을 위해서만 가능성이 높습니다. 배열과 같은 객체에는 일반적으로 length속성이 포함되어 있습니다. 이 경우 나중에 두 예제가 더 적합합니다.
저스틴 존슨

9
항상 다음 foo !== 'undefined' && foo !== null과 같이 바꿀 수 있습니다foo != null
thinklinux

1
@TheComposer는 언어에 따라 Javascript에서 배열의 크기는 array.length에 의해 정의되며 배열은에서 0까지의 모든 요소를 ​​포함한다고 합니다 array.length - 1. 그러나 이러한 값이 모두 정의 된 값은 아닙니다. 배열 멤버에서 delete 키워드를 사용하면 array.length 매개 변수를 증가시켜 배열을 확장하는 것처럼 새 값이 정의되지 않은 상태로 시작되는 것처럼 해당 멤버를 다시 정의되지 않은 상태로 설정합니다. 실제로, 자바 스크립트 구현은 아마도 어레이 스토리지를 최적화 할 것이며, 정의되지 않은 일부 또는 모든 값은 메모리를 차지하지 않을 수 있습니다.
thomasrutter

1
array.length는 아무것도 반복하지 않으며 단지 하나의 숫자입니다.
thomasrutter 2018 년

1
이 답변은 배열 인덱스가 설정되지 않은 경우에는 다루지 않습니다. new Array(1)[0] === undefined그러나 값은 비어 있습니다. [undefined][0] === undefined그러나 값이 설정됩니다. 배열 에는 값이 있습니다. 유일한 완벽한 대답은 사용 in하거나 hasOwnProperty()- idx in array또는 array.hasOwnProperty(idx)이 답변을 --per : stackoverflow.com/a/39171620/3120446을
dx_over_dt

350

우리는 이것을 할 수 없습니다 :

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

10
문제는 배열 의 특정 색인 이 존재 하는지 여부를 테스트하는 방법에 관한 것 입니다.
thomasrutter

26
겠습니까 if(arrayName.length) {...어떤 차이가?
siannone

10
왜 그렇게 많은 투표를합니까? 이것은 분명히 질문에 대답하지 않습니다.
algiogia

10
if(arrayName.length) {...실패null
로니 로이스 톤

5
이것은 [undefined, undefined]길이 = 2 인 배열 인 경우 실패합니다 .
Soldeplata Saketos

41

사용하는 .length것은 안전하지 않으며 일부 브라우저에서 오류가 발생합니다. 더 나은 해결책은 다음과 같습니다.

if(array && array.length){   
   // not empty 
} else {
   // empty
}

또는 다음을 사용할 수 있습니다.

Object.keys(__array__).length

2
«전체 배열이 비어 있는지 확인하고 싶지는 않습니다. 인덱스 값이 "index"인 특정 위치»
Oriol

전체 배열을 확인하려는 사람들을위한 훌륭하고 짧고 간단한 답변
Luis Martins

23
if(!arrayName[index]){
     // do stuff
}

8
배열 값이 존재하지만 0, null, ""등인 경우에도 마찬가지입니다.
thomasrutter

토마스가 옳습니다. 그러나 이것은 많은 경우에 충분합니다 (아마도 열거해야 함).
저스틴 존슨

지금까지 가장 간단한 방법에 의해
더 - 차단기

8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@thomasrutter 정의되지 않은 배열 요소로 끝나는 방법을 생각해 냈습니다.
Rex M

흠, (myarray [1] = undefinedvariable) 작동합니까? 아니면 그냥 (myarray [1] = undefined)?
thomasrutter

@thomasrutter 둘 다 예외를 던질 것입니다. (undefinedvariable은 정의되지 않음)
Rex M

1
Firebug와 같은 것을 사용하여 직접 테스트 할 수 있습니다. Javascript에서 정의되지 않은 변수의 값을 읽으면 예외가 발생하지 않습니다. 정의되지 않은 값이 반환됩니다.
thomasrutter

@thomasrutter 당신은 당신의 첫 코멘트에 틀렸다. x == nullnull 또는 undefined에 대해서만 true이며 다른 것은 없습니다. 마찬가지로 x != nullnull이 아니거나 정의되지 않은 모든 항목에 대해서도 마찬가지입니다. 특별히 정의되지 않은 것을 찾아야하는 경우가 아니라면, 암시 적 변환의 장점에 기대 어라.
Marcus Stade

8

짧고 보편적 인 접근

거짓, 정의되지 않은, null 또는 빈 문자열과 같이 잘못된 값이있는 배열을 확인하려면 다음과 같이 every () 메서드를 사용할 수 있습니다 .

array.every(function(element) {return !!element;}); // returns true or false

예를 들면 다음과 같습니다.

['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true

잘못된 값의 첫 번째 색인을 가져와야 할 경우 다음과 같이 할 수 있습니다.

let falsyIndex; 

if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
  console.log(falsyIndex);
} // logs 3

주어진 인덱스에 대해 잘못된 배열 값을 확인 해야하는 경우 다음과 같이 할 수 있습니다.

if (!!array[index]) {
  // array[index] is a correct value
}
else {
  // array[index] is a falsy value
}

6
if(typeof arr ==='object' && arr instanceof Array ){
   if(!arr.length){
      println 'empty'
   }else{
      printn 'not Empty'
   }

}else{
   println 'Null'
}

'Null'-> 요소가 null이거나 ''과 같은 경우,이 경우 : 모든 'null'요소를 필터링 한 후 배열이 비어 있는지 확인하십시오.

if(!arr.clean().length){return 'is null'}

물론, 전에 깨끗한 방법을 추가하십시오 :

Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

5

다음과 같은 함수를 만드는 것이 좋습니다.

function isEmptyEl(array, i) {
   return !(array[i]);
}

다음과 같이 호출 할 수 있습니다.

if (isEmptyEl(arrayName, indexVal)) {
   console.log('arrayName[' + indexVal + '] is empty');
}

개발자가 isEmptyEl 인터페이스를 준수하게하면 정의되지 않은 arrayName 또는 indexVal 변수와 같은 입력 오류가 발생합니다.

일반적으로 Javascript로 프로그래밍 할 때는 방어 적으로 프로그래밍하는 것이 좋습니다.

arrayName이 정의되지 않은 경우 다음과 같은 오류가 발생합니다.

Uncaught ReferenceError: arrayName is not defined
    at <anonymous>:2:15
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

정의되지 않은 indexVal에 대한 비슷한 결과.

배열 또는 인덱스 값이 없으면 오류가 발생합니다.

유효한 입력의 경우 arrayName [indexVal]이 다음 중 하나 일 경우에만 true를 얻습니다.

  • 없는
  • 찾으시는 주소가 없습니다
  • NaN
  • 빈 문자열
  • 0
  • 그릇된

5

"빈"의 의미에 따라 다릅니다.

해당 이름의 속성이없는 객체에서 속성의 값을 얻으려고하면 값을 얻습니다. undefined 됩니다.

그것이 희소 배열에서 일어나는 것입니다 : 0와 사이의 모든 지수는 아닙니다.array.length-1 .

그래서 당신은 확인할 수 있습니다 array[index] === undefined 있습니다.

그러나 속성 indexundefined값으로 존재할 수 있습니다 . 이 경우를 필터링 하려면 객체에 JavaScript의 속성이 있는지 어떻게 확인합니까?에 설명 된대로 in연산자 또는를 사용할 수 있습니다 .hasOwnProperty

index in array;
array.hasOwnProperty(index);

undefined또는 null값이 있는 기존 속성이 존재하지 않는 것을 고려 하려면 느슨한 비교 array[index] == undefined또는array[index] == null .

배열이 희박하지 않다는 것을 알고 있다면와 비교할 수 index있습니다 array.length. 그러나 안전을 위해 index실제로 배열 인덱스 인지 확인하고 싶을 수도 있습니다. 속성 이름이 배열 인덱스인지 확인을 참조 하십시오.


2
이것은 설정되지 않은 배열 항목 (값이 없음)과 정의되지 않은 값으로 설정된 항목을 올바르게 구별하는 유일한 대답입니다. 설정되지 않은 배열 항목에 액세스하면 정의되지 않은 값이 반환되지만 두 가지 상태가 다르기 때문에 두 가지 상태가 흐리게 표시됩니다.
olivr

잠재적으로 설정되지 않은 값을 가진 배열이있는 경우 hasOwnProperty를 사용하십시오 (정의되지 않거나 널과 다름).
CMCDragonkai

1

자, 배열 값이 JavaScript에 존재하지 않으면 어떻게 될지 먼저 보자. 아래와 같이 배열이 있다면 :

const arr = [1, 2, 3, 4, 5];

이제 6 이 인덱스 5에 있는지 여부를 확인합니다 .

arr[5];

그리고 우리는 얻는다 undefined ...

따라서 기본적으로 대답을 제공 합니다. 정의되지 않은 경우 확인 하는 가장 좋은 방법 은 다음과 같습니다.

if("undefined" === typeof arrayName[index]) {
  //array value is not there...
}

이 경우이 작업을 수행 하지 않는 것이 좋습니다 .

if(!arrayName[index]) {
  //Don't check like this..
}

이 배열이 있다고 상상해보십시오.

const arr = [0, 1, 2];

그리고 우리는 :

if(!arr[0]) {
  //This get passed, because in JavaScript 0 is falsy
}

보시다시피, 0 조차도 인식되지 않으며, 똑같이 할 수있는 다른 것들이 거의 없으며 응용 프로그램을 버그로 만들 수 있으므로 조심스럽게 나열하십시오.

  1. undefined : 값이 정의되어 있지 않은 경우undefined
  2. null : null의 경우, 예를 들어 DOM 요소가 존재하지 않는 경우
  3. 빈 문자열 :''
  4. 0 : 숫자 0
  5. NaN : 숫자가 아님
  6. 그릇된

1

나는 몇 가지 놓친 것 같은 것을 지적하고 싶다. 즉, 배열의 중간에 "빈"배열 위치를 가질 수있다. 다음을 고려하세요:

let arr = [0, 1, 2, 3, 4, 5]

delete arr[3]

console.log(arr)      // [0, 1, 2, empty, 4, 5]

console.log(arr[3])   // undefined

자연스럽게 확인하는 방법은 배열 멤버가 정의되어 있지 않은지 확인하는 것입니다. 다른 방법이 있는지 확실하지 않습니다.

if (arr[index] === undefined) {
  // member does not exist
}

0

array [index]가 null이면 이것을 시도하십시오

if (array[index] != null) 

0

Lodash를 사용하면 다음을 수행 할 수 있습니다.

if(_.has(req,'documents')){
      if (req.documents.length)
      _.forEach(req.documents, function(document){
        records.push(document);
      });
} else {
}

if(_.has(req,'documents'))요청 객체에 이름이 지정된 속성이 있는지 확인 documents하고 해당 소품이 있으면 다음 if (req.documents.length)은 빈 배열이 아닌지 확인 하여 다음 과 같은 다른 항목을 진행할 forEach수 있습니다.


0

정의되지 않았거나 삭제되었는지 확인하려면 다음을 수행하십시오.

if(typeof arrayName[index]==="undefined"){
     //the index is not in the array
}

또한 일부 색인을 삭제 한 연관 배열 및 배열과 함께 작동합니다.

정의되지 않았는지, 삭제되었는지 확인하거나 널 또는 논리 빈 값 (NaN, 빈 문자열, 거짓)입니다.

if(typeof arrayName[index]==="undefined"||arrayName[index]){
     //the index is not defined or the value an empty value
}

0

라 라벨 데이터 테이블을 사용 하여이 문제에 부딪 쳤습니다. properties활동 로그에 호출 된 JSON 값을 저장하고 있었고이 값이 비어 있는지 여부에 따라 버튼을 표시하려고했습니다.

글쎄, datatables는 이것을 비어 있으면 배열로 해석하고 그렇지 않은 경우 객체로 해석했기 때문에 다음 해결책이 효과적이었습니다.

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

객체에는 길이 속성이 없습니다.


0

이 결정은 명령형 OOP 또는 절차 적보다 선언적 기능 프로그래밍을 선호하는 사람들에게 적합하다고 생각합니다. 질문에 " 내부에 값이 있습니까? (진실하거나 잘못된 값)"인 경우 .some방법을 사용 하여 값을 확인할 수 있습니다 .

[].some(el => el || !el);
  • 완벽하지는 않지만 같은 논리를 포함하는 추가 기능을 적용 할 필요는 없습니다 function isEmpty(arr) { ... }.
  • "길이가 0입니까?" 보다 소리가 더 좋습니다. 우리가 수행 할 때 [].length결과 만들어진을로 0하는 경우에 위험하다.
  • 심지어이 [].length > 0말은 "0보다 그 길이가 큰가요?"

고급 예 :

[    ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true

-1

Loadsh 라이브러리를 사용하여 다음과 같이보다 효율적으로 수행 할 수 있습니다.

"pets"라는 배열이있는 경우

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });

널값 또는 정의되지 않은 값에 대한 모든 배열 값을 확인하려면 다음을 수행하십시오.

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

http://underscorejs.org/ 에서 더 많은 예제를 확인하십시오.


fn(){}는 구문 오류이며 배열 항목이 특정 인덱스에 있는지 여부를 확인하는 데 도움이되는 방법은 명확하지 않습니다.
Oriol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.