2011-08-25 18 views
83

Tôi muốn biết cách kiểm tra xem một mảng có trống hay không trong jQuery. Tôi đã thử array.length === 0 nhưng nó không hoạt động. Nó cũng không ném bất kỳ lỗi nào.Kiểm tra xem mảng có trống hay không

Đây là mã:

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

Cách tương tự như trong "JavaScript bình thường": http: // stackoverflow.com/questions/2672380/how-do-i-check-if-a-javascript-mảng-giá trị-là-trống-hoặc-null –

+1

@Julien, tôi đã thử tất cả các giải pháp được liệt kê trong chuỗi đó trước khi bắt đầu chuỗi này. Không ai trong số họ làm việc bằng cách nào đó. – input

+0

Chúng tôi có thể lấy thêm một số mã cho ngữ cảnh không? Xung quanh JavaScript, HTML? Bạn có chắc chắn rằng '$ (" input [name = 'album_text []'] ")' thực sự là các phần tử trả về? –

Trả lời

123

Miễn là bộ chọn của bạn thực sự hoạt động, tôi thấy không có gì sai với mã của bạn để kiểm tra độ dài của mảng. Điều đó sẽ làm những gì bạn muốn. Có rất nhiều cách để làm sạch mã của bạn trở nên đơn giản và dễ đọc hơn. Đây là phiên bản đã được dọn dẹp với ghi chú về những gì tôi đã dọn dẹp.

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 
} 

Một số lưu ý về những gì bạn đang làm và những gì tôi đã thay đổi.

  1. $(this) luôn là đối tượng jQuery hợp lệ nên không có lý do gì để kiểm tra if ($(this)). Nó có thể không có bất kỳ đối tượng DOM nào bên trong nó, nhưng bạn có thể kiểm tra xem có $(this).length nếu cần, nhưng điều đó không cần thiết ở đây vì vòng lặp .each() sẽ không chạy nếu không có mục nào để $(this) bên trong vòng lặp .each() của bạn một cái gì đó.
  2. Không hiệu quả khi sử dụng $ (this) nhiều lần trong cùng một hàm. Tốt hơn nhiều để có được nó một lần vào một biến địa phương và sau đó sử dụng nó từ biến địa phương đó.
  3. Bạn nên khởi tạo các mảng với [] thay vì new Array().
  4. if (value) khi giá trị được mong đợi là một chuỗi sẽ bảo vệ khỏi value == null, value == undefinedvalue == "" để bạn không phải làm if (value && (value != "")). Bạn chỉ có thể làm: if (value) để kiểm tra tất cả ba điều kiện trống.
  5. if (album_text.length === 0) sẽ cho bạn biết nếu mảng có trống miễn là nó là mảng hợp lệ, được khởi tạo (mà nó ở đây).

Bạn đang cố gắng làm gì với công cụ chọn này $("input[name='album_text[]']")?

+5

@MaciekSemik - xem http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons. Tôi luôn sử dụng sự bình đẳng nghiêm ngặt ('===') trừ khi tôi đặc biệt muốn cho phép chuyển đổi kiểu. Đó là một thói quen tốt để tham gia. – jfriend00

6

Bạn nên kiểm tra cho '' (chuỗi rỗng) trước khi đẩy vào mảng của bạn. Mảng của bạn có các phần tử là các chuỗi rỗng. Sau đó, album_text.length === 0 của bạn sẽ hoạt động tốt.

+0

Vui lòng xem mã đã cập nhật. Tôi đã thêm mã này 'if ($ (this) .val() && $ (this) .val()! = '')' Nhưng nó không hoạt động. – input

55

Người dùng JQuery là EmptyObject để kiểm tra xem mảng có chứa phần tử hay không.

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

Đáng tin cậy hơn nhiều so với việc kiểm tra độ dài, đặc biệt nếu biến của bạn cũng có thể là một đối tượng (với các đối tượng, độ dài không hoạt động để kiểm tra xem có trống không). – gaborous

+0

Đây là câu trả lời phù hợp hơn trong quan điểm của tôi. – earl3s

+3

'isEmptyObject' luôn trả về' false' nếu 'Array.prototype' được mở rộng, ví dụ: 'Array.prototype.someFunction = function() {};' - ngay cả khi mảng trống. Lưu ý rằng một số khung công tác (ví dụ: Ember.js) mở rộng nguyên mẫu Array theo mặc định. – jesenko

6

Tôi nghĩ sẽ rất nguy hiểm khi sử dụng $ .isEmptyObject từ jquery để kiểm tra xem mảng có trống không, như @jesenko đã đề cập. Tôi vừa gặp vấn đề đó.

Trong isEmptyObject doc, nó đề cập đến:

Đối số phải luôn luôn là một đồng bằng JavaScript Object

mà bạn có thể xác định bằng cách $.isPlainObject. Sự trở lại của $.isPlainObject([]) là sai.