ตรวจสอบว่าอาร์เรย์ว่างเปล่าหรือเป็นโมฆะ


108

ฉันต้องการทราบวิธีตรวจสอบว่าอาร์เรย์ว่างเปล่าหรือเป็นโมฆะใน jQuery ฉันพยายามarray.length === 0แล้วแต่มันไม่ได้ผล มันไม่ได้ทำให้เกิดข้อผิดพลาดใด ๆ

นี่คือรหัส:

var album_text = new Array();

$("input[name='album_text[]']").each(function(){
  if( $(this).val() &&  $(this).val() != '') {
    album_text.push($(this).val());
  }
});
if (album_text.length === 0) {
  $('#error_message').html("Error");
}

else {
  // send data
}

2
แบบเดียวกับใน "JavaScript ปกติ": stackoverflow.com/questions/2672380/…
Julien Schmidt

1
@ จูเลียนฉันลองใช้วิธีแก้ปัญหาทั้งหมดที่ระบุไว้ในเธรดนั้นก่อนเริ่มเธรดนี้ ไม่มีใครทำงานได้เลย
ข้อมูล

เราขอโค้ดเพิ่มเติมสำหรับบริบทได้ไหม ล้อมรอบ JavaScript, HTML? แน่ใจหรือว่า$("input[name='album_text[]']")กำลังส่งคืนองค์ประกอบจริง
Jon Adams

@JulienSchmidt: คำถามที่คุณเชื่อมโยงเกี่ยวกับการตรวจสอบว่าค่าอาร์เรย์ว่างเปล่าไม่ใช่อาร์เรย์ทั้งหมด
Dan Dascalescu

คำตอบ:


170

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

var album_text = [];

$("input[name='album_text[]']").each(function() {
    var value = $(this).val();
    if (value) {
        album_text.push(value);
    }
});
if (album_text.length === 0) {
    $('#error_message').html("Error");
}

else {
  //send data
}

บันทึกบางส่วนเกี่ยวกับสิ่งที่คุณทำและสิ่งที่ฉันเปลี่ยนแปลง

  1. $(this)มักจะเป็นวัตถุ jQuery if ($(this))ที่ถูกต้องจึงมีเหตุผลที่เคยตรวจสอบไม่มี อาจไม่มีวัตถุ DOM อยู่ข้างใน แต่คุณสามารถตรวจสอบได้ว่า$(this).lengthต้องการหรือไม่ แต่ไม่จำเป็นที่นี่เพราะ.each()ลูปจะไม่ทำงานหากไม่มีรายการดังนั้น$(this)ใน.each()ลูปของคุณจะเป็นบางอย่างเสมอ
  2. การใช้ $ (this) หลาย ๆ ครั้งในฟังก์ชันเดียวกันไม่มีประสิทธิภาพ ดีกว่ามากที่จะทำให้มันกลายเป็นตัวแปรท้องถิ่นแล้วใช้จากตัวแปรท้องถิ่นนั้น
  3. ก็แนะนำให้อาร์เรย์การเริ่มต้นที่มีมากกว่า[]new Array()
  4. if (value)เมื่อค่าที่คาดว่าจะเป็นสตริงทั้งจะปกป้องจากvalue == null, value == undefinedและเพื่อให้คุณไม่ต้องทำvalue == "" if (value && (value != ""))คุณสามารถทำได้: if (value)เพื่อตรวจสอบเงื่อนไขว่างทั้งสามเงื่อนไข
  5. if (album_text.length === 0) จะบอกคุณว่าอาร์เรย์ว่างเปล่าตราบใดที่อาร์เรย์เป็นอาร์เรย์เริ่มต้นที่ถูกต้อง (ซึ่งอยู่ที่นี่)

สิ่งที่คุณพยายามจะทำอย่างไรกับตัวเลือกนี้$("input[name='album_text[]']")?


5
@MaciekSemik - ดูstackoverflow.com/questions/359494/… . ฉันใช้ความเสมอภาคที่เข้มงวดเสมอ ( ===) เว้นแต่ฉันต้องการอนุญาตให้มีการแปลงประเภทโดยเฉพาะ เป็นนิสัยที่ดีที่จะเข้า
jfriend00

76

JQuery ของผู้ใช้คือ EmptyObject เพื่อตรวจสอบว่าอาร์เรย์มีองค์ประกอบหรือไม่

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

2
มีความน่าเชื่อถือมากกว่าการตรวจสอบความยาวโดยเฉพาะอย่างยิ่งหากตัวแปรของคุณสามารถเป็นวัตถุได้ (ด้วยวัตถุความยาวจะไม่สามารถตรวจสอบได้ว่าว่างเปล่า)
พูดไม่ชัด

นี่เป็นคำตอบที่เหมาะสมกว่าในความคิดของฉัน
earl3s

4
isEmptyObjectส่งคืนเสมอfalseหากArray.prototypeมีการขยายเช่นArray.prototype.someFunction = function () {};- แม้ว่าอาร์เรย์จะว่างเปล่า โปรดทราบว่าเฟรมเวิร์กบางส่วน (เช่น Ember.js) ขยาย Array ต้นแบบตามค่าเริ่มต้น
jesenko

4
โปรดใช้ความระมัดระวังด้วยisEmptyObject! สำหรับ jQuery 1.8.3 jQuery.isEmptyObject([])ผลตอบแทนfalseแต่สำหรับ jQuery 1.11.3 trueก็จะส่งกลับ จริงๆแล้วเอกสาร jQueryกล่าวว่าอาร์กิวเมนต์ควรเป็น JavaScript Object ธรรมดาเสมอเนื่องจากอ็อบเจ็กต์ประเภทอื่น ๆ (องค์ประกอบ DOM สตริง / ตัวเลขดั้งเดิมอ็อบเจ็กต์โฮสต์) อาจไม่ให้ผลลัพธ์ที่สอดคล้องกันในเบราว์เซอร์ ขออภัยไม่เห็นคำตอบของ @rhinoxi
Dmitry Vershinin

8

คุณควรตรวจสอบ''(สตริงว่าง) ก่อนที่จะผลักเข้าไปในอาร์เรย์ของคุณ อาร์เรย์ของคุณมีองค์ประกอบที่เป็นสตริงว่าง จากนั้นalbum_text.length === 0จะทำงานได้ดี


โปรดดูรหัสที่อัปเดตแล้ว ฉันเพิ่มรหัสนี้แล้วif( $(this).val() && $(this).val() != '') แต่ก็ใช้ไม่ได้
ข้อมูล

8

ฉันคิดว่ามันอันตรายที่จะใช้ $ .isEmptyObject จาก jquery เพื่อตรวจสอบว่าอาร์เรย์ว่างเปล่าตามที่ @jesenko กล่าวไว้หรือไม่ ฉันเพิ่งเจอปัญหานั้น

ในเอกสาร isEmptyObjectกล่าวถึง:

อาร์กิวเมนต์ควรเป็นวัตถุ JavaScript ธรรมดาเสมอ

ซึ่งคุณสามารถกำหนดได้ $.isPlainObjectได้ การกลับมาของ$.isPlainObject([])เป็นเท็จ

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