배열이 비어 있거나 존재하는지 확인


358

페이지가 처음으로로드 될 때 이미지가 있는지 확인 image_array하고 마지막 이미지를로드해야합니다.

그렇지 않으면 미리보기 버튼을 비활성화하고 사용자에게 새 이미지 버튼을 누르고 빈 배열을 만들어 이미지를 넣도록 경고합니다.

문제는 항상 불 image_array속에 있다는 것 입니다 else. 배열이 존재하면 배열을 재정의하지만 경고는 작동하지 않습니다.

if(image_array.length > 0)
    $('#images').append('<img src="'+image_array[image_array.length-1]+'" class="images" id="1" />');
else{
    $('#prev_image').attr('disabled', 'true');
    $('#next_image').attr('disabled', 'true');
    alert('Please get new image');
    var image_array = [];
}

업데이트 html을로드하기 전에 다음과 같은 것이 있습니다.

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>

콘솔 로그 image_array-무엇을 얻습니까?
Utkanos

var image_array = []가있는 경우 @Utkanos // var image_array = [] (comented)-실제 배열 인 경우 undefined
user1564141

array? .length-널리 지원되며 곧 기본 기능이 될 것입니다
Anbu Agarwal

답변:


516
if (typeof image_array !== 'undefined' && image_array.length > 0) {
    // the array is defined and has at least one element
}

내재 된 전역 변수와 변수 게양으로 인해 문제가 발생할 수 있습니다. var변수를 선언 할 때마다 사용하십시오 :

<?php echo "var image_array = ".json_encode($images);?>
// add var  ^^^ here

그런 다음 나중에 실수로 해당 변수를 다시 선언하지 마십시오.

else {
    ...
    image_array = []; // no var here
}

33
아니. 이것은 image_array가 null 일 때 폭발합니다. 머피의 법칙에 따르면 언젠가는 그럴 것이라고합니다.
Marco Faustinelli 2016 년

7
하지가 image_array.length충분? (하지 않고는 지정 >0)
mcont

궁금한 점 : @JamesDrinkard의 답변을 사용하여 중단되는 유스 케이스를 찾을 수 있습니까?
tsemer

11
if (image_array && image_array.length){ // array exists and has elements
YeeHaw1234

195

배열이 비어 있는지 확인하려면

현대적인 ES5 + 방법 :

if (Array.isArray(array) && array.length) {
    // array exists and is not empty
}

옛날 방식 :

typeof array != "undefined"
    && array != null
    && array.length != null
    && array.length > 0

컴팩트 한 방법 :

if (typeof array != "undefined" && array != null && array.length != null && array.length > 0) {
    // array exists and is not empty
}

CoffeeScript 방식 :

if array?.length > 0

왜?

Case Undefined
정의 되지 않은 변수는 아직 아무것도 할당하지 않은 변수입니다.

let array = new Array();     // "array" !== "array"
typeof array == "undefined"; // => true

Case Null
일반적으로 null은 값이없는 상태입니다. 예를 들어 일부 데이터를 놓치거나 검색하지 못한 경우 변수는 null입니다.

array = searchData();  // can't find anything
array == null;         // => true

배열이 아닌 경우
Javascript에는 동적 유형 시스템이 있습니다. 따라서 변수에 어떤 유형의 객체가 있는지 보장 할 수 없습니다. 의 인스턴스와 대화하지 않을 가능성이 Array있습니다.

supposedToBeArray =  new SomeObject();
typeof supposedToBeArray.length;       // => "undefined"

array = new Array();
typeof array.length;                   // => "number"

Case Empty Array
이제 다른 모든 가능성을 테스트 했으므로의 인스턴스와 대화하고 Array있습니다. 비어 있지 않은지 확인하기 위해 보유하고있는 요소의 수와 0 개 이상의 요소가 있는지 확인합니다.

firstArray = [];
firstArray.length > 0;  // => false

secondArray = [1,2,3];
secondArray.length > 0; // => true

8
null 인 경우 우리는 얻을 것이기 때문에 확인하는 것만으로 는 충분 하지 않습니다 . (typeof array != "undefined" && array.length > 0)arrayTypeError: Cannot read property 'length' of null
Pooyan Khosravi

||로 변경 &&
사 하르

!(typeof array !== "undefined") || !(array.length > 0)? 그냥 시도했지만 같은 오류가 발생했습니다. 사용 방법에 대한 완전한 예를 들어 주 ||시겠습니까?
Pooyan Khosravi 16:30에

나는 의미했다(typeof array != "undefined" || array.length > 0)
Sahar Ch.

설명해 주셔서 감사합니다. if를 (typeof array != "undefined" || array.length > 0)반환 true합니다 array = null. if를 !(typeof array != "undefined" || array.length > 0)반환 false합니다 array = [1,2]. 이해하지 못해서 죄송하지만 @Elsa는 실례를 보여줄 수 있습니까? 미리 감사드립니다.
Pooyan Khosravi 2016 년

70

어떻습니까 (ECMA 5.1) :

if(Array.isArray(image_array) && image_array.length){
  // array exists and is not empty
}

1
다시 .. && image_array.length). IMHO, 당신은 동안 안전하게 JS의 느슨한 입력에 의존하는 변환 0정수 falsenon-zero정수 true"당신이 무엇을 의미하는 말"을, 나는 미래의 가독성을 위해 바람직 그것을 고려합니다. 나는 할 것이다 .. && image_array.length > 0).
ToolmakerSteve

28

이것이 내가 사용하는 것입니다. 첫 번째 조건은 진실성 (null 및 undefined)을 모두 포함합니다. 두 번째 조건은 빈 배열을 확인합니다.

if(arrayName && arrayName.length > 0){
    //do something.
}

또는 tsemer의 의견 덕분에 두 번째 버전을 추가했습니다.

if(arrayName && arrayName.length)

그런 다음 Firefox에서 Scratchpad를 사용하여 두 번째 조건을 테스트했습니다.

var array1;
var array2 = [];
var array3 = ["one", "two", "three"];
var array4 = null;

console.log(array1);
console.log(array2);
console.log(array3);
console.log(array4);

if (array1 && array1.length) {
  console.log("array1! has a value!");
}

if (array2 && array2.length) {
  console.log("array2! has a value!");
}

if (array3 && array3.length) {
  console.log("array3! has a value!");
}

if (array4 && array4.length) {
  console.log("array4! has a value!");
}

이는 또한 증명 if(array2 && array2.length)if(array2 && array2.length > 0)정확히 같은 일을하고 있습니다


13
이것이 가장 간결하며 모든 예외 문제를 다룹니다. 그리고 당신이 진실함을 좋아하기 때문에 할 수도 있습니다if (arrayName && arrayName.length)
tsemer

2
짧고 빠르게! null을 확인하기 위해 if (obj)에 익숙해지기 위해 C #에서 오는 데 시간이 걸렸지 만 이제는 그것을 좋아합니다. if (obj) // null check; if (array && array.length) // 배열 null 또는 빈 검사; if (array &&! array.length) // 배열이 존재하지만 빈 검사; if (str) // 문자열이 null이 아니고 비어 있지 않습니다. 0이 유효한 숫자이면 숫자에 유일하게 사용되지 않습니다.
Rick Love

1
나는 잠시 동안 (arrayName && arrayName.length)을 사용하고 있는데 뭔가 문제가 있는지 걱정했습니다. 이 답변은 감사합니다. :)
Koray

var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0TypeScript에는 isNotEmpty의 유형이 부울이 아니고 부울이 정의되지 않은 것처럼 뉘앙스 가 있습니다.
Giedrius

15

다음을 사용해야합니다.

  if (image_array !== undefined && image_array.length > 0)

8

이미지 배열 변수가 정의되었는지 테스트하려면 다음과 같이하십시오.

if(typeof image_array === 'undefined') {
    // it is not defined yet
} else if (image_array.length > 0) {
    // you have a greater than zero length array
}


@ user1564141 설정되는 image_array와 관련하여 함수가 선언되는 위치를 말하기 어렵습니다. 호스팅 문제가있을 수 있으므로 해당 변수를 var index_array = ...로 선언해야 할 수도 있습니다. 또한 index_array를 닫도록 설정 한 스크립트 태그입니다. 스크린 샷에는 나타나지 않습니다.
마이크 브랜트

또 다른 경고는 배열이 비어있을 때만 발생하지만 var image_array는 매번 작동합니다 ... 왜 이해할 수 없습니까?
user1564141

@ user1564141 소스를 출력으로 표시하도록 질문을 업데이트하면 도움이됩니다. 나는 여전히 if-else 논리가 index_array 선언의 위치와 관련하여 소스 내에서 어디에 있는지 느끼지 못합니다.
마이크 브랜트

6

자바 스크립트

( typeof(myArray) !== 'undefined' && Array.isArray(myArray) && myArray.length > 0 )

Lodash 및 밑줄

( _.isArray(myArray) && myArray.length > 0 )

6

jQuery를 사용 isEmptyObject()하여 배열에 요소가 포함되어 있는지 여부를 확인할 수 있습니다 .

var testArray=[1,2,3,4,5]; 
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true 

출처 : https://api.jquery.com/jQuery.isEmptyObject/


이것은 동적으로 추가 된 요소 (ajax)에서 array.push ()가있는 요소를 추가 할 때 나를 위해 일한 유일한 것입니다. 감사합니다
TomoMiha

3

존재하지 않는 경우 예외가 발생하지 않고 부울로 변환하는 간단한 방법 :

!!array

예:

if (!!arr) {
  // array exists
}

3

이건 어때요 ? 정의되지 않은 배열의 길이를 확인하면 예외가 발생할 수 있습니다.

if(image_array){
//array exists
    if(image_array.length){
    //array has length greater than zero
    }
}

중첩은 if사용을 방지 할 수 &&처럼 image_array && image_array.length, 그것은 단락 않을 경우 image_array존재하지 않습니다.
rvazquezglez

3

필자는 jsfiddle에 넣을 때 높은 등급의 답변 "작동"을 확신하지만 동적으로 생성 된 배열 목록을 가질 때이 코드의 많은 부분이 ME에서 작동하지 않습니다.

이것이 나를 위해 일하는 것입니다.

var from = [];

if(typeof from[0] !== undefined) {
  //...
}

undefined 주위에 따옴표가 없으며 길이를 귀찮게하지 않습니다.


1
두 의견 : 1) typeof문자열을 반환합니다. 비교 undefined는 항상 색다른 것입니다. 2) from정의되어 있는지 확인하지 않습니다 . 그렇지 않으면 위의 코드에서 오류가 발생합니다
Xeltor

@Xeltor 아니요. 이것을 증명하거나 의견을 제거하려면 jsfiddle 또는 plunker를 제공하십시오.
Tom Stickel

@ Xeltor, 그냥보고 당신의 대답은 -2이며 BOLD에서 당신이 잘못되었다고 말하는 사람들과 의견이 가득 찬 것 같습니다.
Tom Stickel

3

옵션 체인

옵션 체인 제안이 4 단계에 도달하여 더 많은 지원을 받고 있으므로이를 수행하는 매우 우아한 방법이 있습니다.

if(image_array?.length){

  // image_array is defined and has at least one element

}

2

Javascript 에서이 문제를 상당히 많이 겪습니다. 나를 위해 가장 좋은 방법은 길이를 확인하기 전에 매우 광범위한 검사를하는 것입니다. 나는이 Q & A에서 다른 솔루션을 보았다,하지만 난 하나를 확인 할 수 있기를 원 null하거나 undefined또는 다른 거짓 값.

if(!array || array.length == 0){
    console.log("Array is either empty or does not exist")
}

이 먼저 확인합니다 undefined, null또는 다른 거짓 값. 그중 하나라도 사실이라면 이것이 부울을 완성합니다 OR. 그런 다음 array.length배열이 정의되지 않은 경우 오류가 발생할 수 있는보다 위험한 검사를 확인할 수 있습니다. arrayis undefined또는 null인 경우 도달하지 않으므로 조건의 순서는 매우 중요합니다.



1

다음은 객체 범위와 함수에 전달 된 모든 유형의 가능한 데이터 유형에 대한 몇 가지 문제를 관리하는 데 오류가 발생하는 함수에 싸인 솔루션입니다.

이 문제를 검사하는 데 사용되는 바이올린은 다음과 같습니다 ( source )

var jill = [0];
var jack;
//"Uncaught ReferenceError: jack is not defined"

//if (typeof jack === 'undefined' || jack === null) {
//if (jack) {
//if (jack in window) {
//if (window.hasOwnP=roperty('jack')){
//if (jack in window){

function isemptyArray (arraynamed){
    //cam also check argument length
  if (arguments.length === 0) { 
    throw "No argument supplied";
  }

  //console.log(arguments.length, "number of arguments found");
  if (typeof arraynamed !== "undefined" && arraynamed !== null) {
      //console.log("found arraynamed has a value");
      if ((arraynamed instanceof Array) === true){
        //console.log("I'm an array");
        if (arraynamed.length === 0) {
            //console.log ("I'm empty");
            return true;
        } else {
          return false;
        }//end length check
      } else {
        //bad type
        throw "Argument is not an array";
      } //end type check
  } else {
    //bad argument
    throw "Argument is invalid, check initialization";;
  }//end argument check
}

try {
  console.log(isemptyArray(jill));
} catch (e) {
    console.log ("error caught:",e);
}

0

배열로 선언 된 변수가없는 경우 검사를 만들 수 있습니다.

if(x && x.constructor==Array && x.length){
   console.log("is array and filed");
}else{
    var x= [];
    console.log('x = empty array');
}

변수 x가 있는지 확인하고 변수 x가 있으면 채워진 배열인지 확인합니다. 그렇지 않으면 빈 배열을 만듭니다 (또는 다른 작업을 수행 할 수 있음).

당신이 경우 특정 생성 된 배열 변수는 간단한 검사가 있습니다 :

var x = [];

if(!x.length){
    console.log('empty');
} else {
    console.log('full');
}

배열을 확인하는 가장 가능한 방법을 보여 주면서 여기 에서 바이올린을 확인할 수 있습니다 .


0

당신은 이것을해야합니다

    if (!image_array) {
      // image_array defined but not assigned automatically coerces to false
    } else if (!(0 in image_array)) {
      // empty array
      // doSomething
    }

-1

ts에서

 isArray(obj: any) 
{
    return Array.isArray(obj)
  }

html로

(photos == undefined ||! (isArray (photos) && photos.length> 0))


3
확실합니까? 두 번째 부분은 결국 HTML처럼 보이지 않습니다
Nico Haase

-3

image_array를 만들면 비어 있으므로 image_array.length는 0입니다.

아래 의견에서 언급 했듯이이 질문의 답변을 기반으로 답변을 편집합니다 .

var image_array = []

else 괄호 안에는 코드에서 이전에 정의 된 image_array로 아무것도 변경하지 않습니다.


페이지를로드 할 때 소스에 있습니다 ... 게시하는 것을 잊지 마십시오.
user1564141

내 대답에 잘못되었을 수있는 내용을 추가하고 싶습니다. 공통 언어에서 블록 내부에서 생성 된 내용은 블록 "외부"에 표시되지 않습니다. []var image_array = []else 블록 내부 를 정의 할 때 외부에서 볼 수 있는지 확실하지 않습니다. 시도image_array = []
Al_th

하지만 다른 것에서 image_array를 제거하면 모든 것이 잘 작동합니다.
user1564141
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.