ตรวจสอบว่าอาร์เรย์ว่างเปล่าหรือมีอยู่จริง


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

@Utkanos หากมี var image_array = [] - ไม่ได้กำหนดถ้า // var image_array = [] (แสดง) - อาร์เรย์จริง
user1564141

อาร์เรย์? .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
Nope สิ่งนี้จะระเบิดเมื่อ image_array เป็นโมฆะ กฎหมายของเมอร์ฟีระบุว่าบางวันมันจะ
Marco Faustinelli

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
Undefined เป็นตัวแปรที่คุณยังไม่ได้กำหนดอะไรให้กับมัน

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

Case Null
โดยทั่วไปแล้ว null จะเป็นสถานะของการขาดค่า ตัวอย่างเช่นตัวแปรเป็นโมฆะเมื่อคุณพลาดหรือไม่สามารถดึงข้อมูลบางอย่างได้

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

Case Not Array
Javascript มีระบบการพิมพ์แบบไดนามิก ซึ่งหมายความว่าเราไม่สามารถรับประกันประเภทของวัตถุที่ตัวแปรถืออยู่ Arrayมีโอกาสที่เราไม่ได้พูดคุยกับตัวอย่างของเป็น

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

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

กรณีอาร์เรย์ที่ว่างเปล่า
ตั้งแต่ตอนนี้เราได้ทดสอบความเป็นไปได้อื่น ๆ Arrayทั้งหมดที่เรากำลังพูดคุยกับตัวอย่างของ เพื่อให้แน่ใจว่าไม่ว่างเปล่าเราจะถามจำนวนองค์ประกอบที่ถืออยู่และตรวจสอบว่ามีองค์ประกอบมากกว่าศูนย์

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

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

8
โปรดทราบว่ามันไม่เพียงพอที่จะเพียงแค่ตรวจสอบ(typeof array != "undefined" && array.length > 0)เพราะถ้าเป็นโมฆะเราจะได้รับarray TypeError: Cannot read property 'length' of null
Pooyan Khosravi

อาจเปลี่ยน && ด้วย ||
Sahar Ch.

!(typeof array !== "undefined") || !(array.length > 0)? เพียงแค่ลองมันมีข้อผิดพลาดเดียวกัน คุณช่วยยกตัวอย่างวิธีการใช้งานให้เราได้||หรือไม่?
Pooyan Khosravi

ฉันหมายถึง(typeof array != "undefined" || array.length > 0)
Sahar Ch

ขอบคุณสำหรับการชี้แจง (typeof array != "undefined" || array.length > 0)ผลตอบแทนถ้าtrue ผลตอบแทนถ้า ขออภัยที่ไม่เข้าใจ แต่ @Elsa คุณสามารถให้ตัวอย่างการทำงานได้หรือไม่ ขอบคุณล่วงหน้า. array = null!(typeof array != "undefined" || array.length > 0)falsearray = [1,2]
Pooyan Khosravi

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จำนวนเต็มเป็นfalseและnon-zeroจำนวนเต็มเป็นอย่างปลอดภัยtrueฉันคิดว่าน่าจะดีกว่าสำหรับการอ่านในอนาคตเพื่อ "พูดในสิ่งที่คุณหมายถึง" .. && image_array.length > 0)ฉันจะทำ
ToolmakerSteve

28

นี่คือสิ่งที่ฉันใช้ เงื่อนไขแรกครอบคลุมความจริงซึ่งมีทั้งโมฆะและไม่ได้กำหนด เงื่อนไขที่สองตรวจสอบอาร์เรย์ที่ว่างเปล่า

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

หรือขอบคุณที่แสดงความคิดเห็น tsemer ของฉันเพิ่มรุ่นที่สอง

if(arrayName && arrayName.length)

จากนั้นฉันทำการทดสอบเงื่อนไขที่สองโดยใช้ Scratchpad ใน Firefox:

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
สั้นและรวดเร็ว! ฉันใช้เวลาสักครู่ที่จะมาจาก C # เพื่อให้ชินกับ (obj) เพื่อตรวจสอบ null แต่ตอนนี้ฉันรักมัน: if (obj) // ตรวจสอบ null; if (array && array.length) // อาร์เรย์ว่างหรือเช็คว่างเปล่า if (array &&! array.length) // array มีอยู่ แต่ตรวจสอบว่างเปล่า; if (str) // string ไม่ใช่ null และไม่ว่างเปล่า gotcha เดียวที่ไม่ได้ใช้กับตัวเลขถ้าศูนย์เป็นตัวเลขที่ถูกต้อง
Rick Love

1
ฉันเคยใช้ (arrayName && arrayName.length) มาระยะหนึ่งแล้วฉันก็กังวลว่ามันจะมีอะไรผิดปกติหรือเปล่า คำตอบนี้ทำให้ฉันรู้สึกสบายใจขอบคุณ :)
Koray

ใน typescript มีความแตกต่างสำหรับvar arrayName = undefined; var isNotEmpty = arrayName && array.length > 0ชนิดสำหรับ isNotEmpty จะไม่เป็นบูลีนมันจะเป็นบูลีน | undefined
Giedrius


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 ถูกปิด มันไม่ปรากฏจากภาพหน้าจอ
Mike Brant

ในอย่างอื่นก็คือการแจ้งเตือนซึ่งจะยิงเฉพาะเมื่ออาเรย์นั้นว่าง แต่ var image_array ใช้ได้ทุกครั้ง ... ฉันไม่เข้าใจว่าทำไม?
user1564141

@ user1564141 มันจะช่วยถ้าคุณสามารถอัปเดตคำถามของคุณเพื่อแสดงแหล่งที่มาเป็นผลลัพธ์ ฉันยังไม่รู้สึกว่าตรรกะ if-else ของคุณอยู่ที่ไหนภายในแหล่งข้อมูลเทียบกับตำแหน่งของการประกาศ index_array ของคุณ
Mike Brant

6

JavaScript

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

ลอด & ขีดล่าง

( _.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/


นี่เป็นสิ่งเดียวที่ทำงานสำหรับฉันเมื่อเพิ่มองค์ประกอบด้วย array.push () - จากองค์ประกอบที่เพิ่มแบบไดนามิก (ajax) ขอบคุณ
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 แต่เมื่อฉันมีรายการอาร์เรย์ที่สร้างขึ้นแบบไดนามิกจำนวนมากของรหัสนี้ในคำตอบก็ไม่ได้ผลสำหรับฉัน

นี่คือสิ่งที่ทำงานให้ฉัน

var from = [];

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

สังเกตุ, ไม่มีเครื่องหมายคำพูดรอบ ๆ ไม่ได้กำหนดและฉันไม่ได้สนใจกับความยาว


1
สองความคิดเห็น: 1) typeofส่งคืนสตริงการเปรียบเทียบundefinedจะเป็น flasy เสมอ 2) คุณไม่ตรวจสอบว่าfromมีการกำหนดไว้หรือไม่ รหัสของคุณด้านบนจะเกิดข้อผิดพลาดหากไม่ใช่
Xeltor

@ Xeltor ไม่มันจะไม่ โปรดระบุ jsfiddle หรือคนขุดเจาะเพื่อพิสูจน์หรือลบความคิดเห็นของคุณ
Tom Stickel

@ Xeltor เพียงแค่มองและดูเหมือนว่าคำตอบของคุณมี -2 และหนุนความคิดเห็นที่เต็มไปด้วยผู้คนที่พูดเป็นตัวหนาว่าคุณผิด
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ซึ่งอาจทำให้เกิดข้อผิดพลาดกับเราหากไม่ได้กำหนดอาเรย์ไว้ จะไม่สามารถเข้าถึงได้หากarrayเป็นundefinedหรือnullดังนั้นการสั่งซื้อเงื่อนไขจึงมีความสำคัญมาก



1

ต่อไปนี้เป็นโซลูชันของฉันที่รวมอยู่ในฟังก์ชั่นที่ยังโยนข้อผิดพลาดเพื่อจัดการปัญหาสองสามอย่างกับขอบเขตของวัตถุและประเภทข้อมูลที่เป็นไปได้ทุกประเภทที่ส่งผ่านไปยังฟังก์ชัน

นี่คือซอของฉันที่ใช้ในการตรวจสอบปัญหานี้ (ที่มา )

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 มีอยู่หรือไม่และเป็นค่านั้นหรือไม่ตรวจสอบว่าเป็นอาร์เรย์ที่เติมเต็มหรือไม่ มิฉะนั้นมันจะสร้างอาร์เรย์ที่ว่างเปล่า (หรือคุณสามารถทำสิ่งอื่น ๆ );

หากคุณมั่นใจว่ามีตัวแปรอาเรย์ที่สร้างขึ้นจะมีการตรวจสอบง่าย ๆ :

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

ในทีเอส

 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 = []

ในวงเล็บอื่นจะไม่เปลี่ยนสิ่งใด ๆ เป็น image_array ที่กำหนดไว้ก่อนหน้าในรหัส


ฉันมีมันในแหล่งที่มาเมื่อโหลดหน้า ... แค่ลืมโพสต์
user1564141

ฉันต้องการเพิ่มบางสิ่งลงในคำตอบของฉันที่อาจผิดดังนั้นฉันจึงระบุไว้ที่นี่ ในภาษาทั่วไปสิ่งที่สร้างขึ้นภายในบล็อกจะมองไม่เห็น "ภายนอก" บล็อก ตามที่คุณกำหนด[]var image_array = []ไว้ในบล็อกอื่นฉันไม่แน่ใจว่าสามารถมองเห็นได้จากด้านนอก ลองimage_array = []
Al_th

แต่ถ้าฉันลบ image_array จากสิ่งอื่นทุกอย่างใช้ได้ดี
user1564141
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.