Kiểm tra nếu một mảng trống hoặc tồn tại


358

Khi trang đang tải lần đầu tiên, tôi cần kiểm tra xem có hình ảnh nào không image_arrayvà tải hình ảnh cuối cùng.

Mặt khác, tôi vô hiệu hóa các nút xem trước, cảnh báo người dùng nhấn nút hình ảnh mới và tạo một mảng trống để đặt hình ảnh;

Vấn đề là image_arraytrong các elsevụ cháy mọi lúc. Nếu một mảng tồn tại - nó chỉ ghi đè lên nó, nhưng cảnh báo không hoạt động.

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

CẬP NHẬT Trước khi tải html, tôi có một cái gì đó như thế này:

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

Nhật ký bảng điều khiển image_array- bạn nhận được gì?
Utkanos

@Utkanos nếu có var image_array = [] - không xác định nếu // var image_array = [] (coment) - mảng thực.
dùng1564141

mảng? .length - được hỗ trợ rộng rãi và sẽ sớm trở thành một tính năng gốc
Anbu Agarwal

Câu trả lời:


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

Vấn đề của bạn có thể xảy ra do sự kết hợp của các biến toàn cục ẩn và cẩu nâng. Đảm bảo bạn sử dụng varbất cứ khi nào khai báo một biến:

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

Và sau đó hãy chắc chắn rằng bạn không bao giờ vô tình xác định lại biến đó sau:

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

33
Không. Điều này sẽ nổ khi image_array là null. Luật pháp của Murphy nói rằng một ngày nào đó nó sẽ.
Marco Faustinelli 20/03/2015

7
Không image_array.lengthđủ sao? (không ghi rõ >0)
mcont

Tò mò: Bạn có thể tìm thấy bất kỳ trường hợp sử dụng nào sẽ phá vỡ bằng cách sử dụng câu trả lời của @JamesDrinkard không?
tsTable

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

195

Để kiểm tra xem một mảng có trống hay không

Một cách hiện đại, ES5 +:

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

Một cách học cũ:

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

Một cách nhỏ gọn:

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

Một cách CoffeeScript:

if array?.length > 0

Tại sao?

Trường hợp không xác
định Biến không xác định là biến mà bạn chưa gán bất cứ điều gì cho nó.

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

Case Null
Nói chung, null là trạng thái thiếu giá trị. Ví dụ, một biến là null khi bạn bỏ lỡ hoặc không lấy được một số dữ liệu.

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

Case Không phải là một Array
Javascript có một hệ thống kiểu động. Điều này có nghĩa là chúng ta không thể đảm bảo loại đối tượng mà một biến giữ. Có một cơ hội mà chúng ta không nói đến một ví dụ Array.

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

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

Case Empty Array
Bây giờ vì chúng tôi đã thử nghiệm tất cả các khả năng khác, chúng tôi đang nói đến một ví dụ về Array. Để đảm bảo nó không trống, chúng tôi hỏi về số lượng phần tử mà nó đang giữ và đảm bảo rằng nó có nhiều hơn các phần tử bằng không.

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

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

8
Xin lưu ý rằng chỉ kiểm tra là không đủ (typeof array != "undefined" && array.length > 0)vì nếu arraykhông, chúng tôi sẽ nhận được TypeError: Cannot read property 'length' of null.
Pooyan Khosravi

Có thể thay đổi && với | |
Sahar Ch.

!(typeof array !== "undefined") || !(array.length > 0)? Chỉ cần thử nó, có lỗi tương tự. Bạn có thể cho chúng tôi một ví dụ đầy đủ về cách sử dụng ||?
Pooyan Khosravi

Ý tôi là(typeof array != "undefined" || array.length > 0)
Sahar Ch.

Cảm ơn đã làm rõ. (typeof array != "undefined" || array.length > 0)trả về truenếu array = null. !(typeof array != "undefined" || array.length > 0)trả về falsenếu array = [1,2]. Xin lỗi vì không hiểu, nhưng @Elsa bạn có thể cung cấp một ví dụ hoạt động không? Cảm ơn trước.
Pooyan Khosravi

70

Còn về (ECMA 5.1):

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

1
Re .. && image_array.length). IMHO, trong khi bạn có thể tin tưởng vào việc gõ lỏng lẻo của JS, để chuyển đổi một 0số nguyên thành falsevà một non-zerosố nguyên thành true, tôi cho rằng nó thích hợp hơn, để dễ đọc trong tương lai, để "nói ý của bạn". Tôi sẽ làm gì .. && image_array.length > 0).
ToolmakerSteve

28

Đây là những gì tôi sử dụng. Điều kiện đầu tiên bao gồm sự thật, có cả null và không xác định. Điều kiện thứ hai kiểm tra một mảng trống.

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

hoặc nhờ bình luận của tsemer, tôi đã thêm phiên bản thứ hai

if(arrayName && arrayName.length)

Sau đó, tôi đã thực hiện một thử nghiệm cho điều kiện thứ hai, sử dụng Scratchpad trong 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!");
}

điều này cũng chứng minh điều đó if(array2 && array2.length)if(array2 && array2.length > 0)chính xác là làm như vậy


13
Tôi thấy điều này là ngắn gọn nhất và bao gồm tất cả các vấn đề ngoại lệ. Và vì bạn thích sự thật, thậm chí có thể làm được vớiif (arrayName && arrayName.length)
tsemer

2
Ngắn gọn và nhanh chóng! Phải mất một thời gian tôi mới đến từ C # để làm quen với if (obj) để kiểm tra null, nhưng bây giờ tôi thích nó: if (obj) // null check; if (mảng && Array.length) // mảng null hoặc kiểm tra trống; if (mảng &&! Array.length) // mảng tồn tại, nhưng kiểm tra trống; if (str) // chuỗi không null và không rỗng. Gotcha duy nhất không được sử dụng trên các số nếu số 0 là số hợp lệ.
Rick Yêu

1
Tôi đã sử dụng (ArrayName && ArrayName.length) trong một thời gian sau đó tôi đã lo lắng nếu có thể có gì đó không ổn về nó. Câu trả lời này đã an ủi tôi, cảm ơn :)
Koray

Trong Typecript có các sắc thái, như đối với var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0kiểu cho isNotEmpty sẽ không phải là boolean, nó sẽ là boolean | không xác định.
Giedrius

15

Bạn nên sử dụng:

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

8

Nếu bạn muốn kiểm tra xem biến mảng hình ảnh đã được xác định chưa, bạn có thể làm như thế này không

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 khó có thể biết vị trí của hàm được khai báo liên quan đến image_array của bạn được đặt. Bạn có thể gặp sự cố lưu trữ, vì vậy bạn có thể cần phải khai báo biến đó là var index_array = ... Ngoài ra, là thẻ script nơi bạn đặt index_array bị đóng. Nó không xuất hiện như vậy từ ảnh chụp màn hình.
Mike Brant

Mặt khác cũng là cảnh báo, chỉ bắn khi mảng trống, nhưng var image_array hoạt động mỗi lần ... Tôi không thể hiểu tại sao?
dùng1564141

@ user1564141 Sẽ rất hữu ích nếu bạn có thể cập nhật câu hỏi của mình để hiển thị nguồn dưới dạng đầu ra. Tôi vẫn không có cảm giác về nơi logic if-other của bạn nằm trong nguồn so với vị trí khai báo index_array của bạn.
Mike Brant

6

JavaScript

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

Nhà nghỉ & gạch dưới

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

6

Bạn có thể sử dụng jQuery isEmptyObject()để kiểm tra xem mảng có chứa các 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 

Nguồn: https://api.jquery.com/jQuery.isEmptyObject/


Đây là điều duy nhất phù hợp với tôi khi thêm các phần tử với mảng.push () - từ các phần tử được thêm động (ajax). Cảm ơn
TomoMiha

3

Một cách đơn giản không dẫn đến ngoại lệ nếu không tồn tại và chuyển đổi thành boolean:

!!array

Thí dụ:

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

3

Còn cái này thì sao ? kiểm tra độ dài của mảng không xác định có thể ném ngoại lệ.

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

Việc lồng nhau ifcó thể tránh được bằng cách sử dụng &&, như trong image_array && image_array.length, nó sẽ bị đoản mạch nếu image_arraykhông tồn tại.
rvazquezglez

3

Đối với tôi chắc chắn một số câu trả lời được đánh giá cao "hoạt động" khi tôi đặt chúng vào jsfiddle, nhưng khi tôi có một lượng danh sách mảng được tạo động, rất nhiều mã này trong các câu trả lời không hoạt động cho ME.

Đây là những gì IS làm việc cho tôi.

var from = [];

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

Lưu ý, KHÔNG trích dẫn xung quanh không xác định và tôi không bận tâm với độ dài.


1
hai nhận xét: 1) typeoftrả về một chuỗi, so sánh undefinedsẽ luôn là flasy 2) bạn không kiểm tra nếu fromđược xác định. mã của bạn ở trên sẽ gây ra lỗi nếu không phải
Xeltor

@Xeltor Không, nó sẽ không. vui lòng cung cấp jsfiddle hoặc plunker của bạn để chứng minh điều này hoặc xóa bình luận của bạn.
Tom Stickel

@Xeltor, chỉ cần nhìn và có vẻ như câu trả lời của bạn có -2 và đầy ắp những bình luận với những người nói trong BÓNG rằng bạn đang SAI.
Tom Stickel

3

chuỗi tùy chọn

Khi đề xuất xích tùy chọn đạt đến giai đoạn 4 và đang nhận được sự hỗ trợ rộng rãi hơn, có một cách rất thanh lịch để làm điều này

if(image_array?.length){

  // image_array is defined and has at least one element

}

2

Tôi gặp vấn đề này khá nhiều trong Javascript. Đối với tôi cách tốt nhất để làm điều đó là kiểm tra rất rộng trước khi kiểm tra độ dài. Tôi đã thấy một số giải pháp khác trong Hỏi & Đáp này, nhưng tôi muốn có thể kiểm tranull hoặc undefinedhoặc bất kỳ giá trị sai khác.

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

Đây lần đầu tiên sẽ kiểm tra undefined, nullhoặc giá trị sai khác. Nếu bất kỳ điều nào là đúng, nó sẽ hoàn thành boolean vì đây là một OR. Sau đó, kiểm tra rủi ro hơn array.length, có thể lỗi chúng tôi nếu mảng không được xác định, có thể được kiểm tra. Điều này sẽ không bao giờ đạt được nếu arrayundefinedhoặc null, vì vậy việc sắp xếp các điều kiện là rất quan trọng.



1

Sau đây là giải pháp của tôi được gói trong một hàm cũng đưa ra các lỗi để quản lý một vài vấn đề với phạm vi đối tượng và tất cả các loại dữ liệu có thể được truyền cho hàm.

Đây là bí quyết của tôi được sử dụng để kiểm tra vấn đề này ( nguồn )

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

Nếu bạn không có một biến được khai báo là mảng, bạn có thể tạo một kiểm tra:

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

Điều này kiểm tra nếu biến x tồn tại và nếu có, kiểm tra xem nó có phải là một mảng đầy không. mặt khác, nó tạo ra một mảng trống (hoặc bạn có thể làm những thứ khác);

Nếu bạn chắc chắn có một biến mảng được tạo, có một kiểm tra đơn giản:

var x = [];

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

Bạn có thể kiểm tra fiddle của tôi ở đây với các cách hiển thị hầu hết các cách có thể để kiểm tra mảng.


0

Bạn nên làm điều này

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

0

Tôi nghĩ mã đơn giản này sẽ hoạt động:

if(!(image_array<=0)){
//Specify function needed
}

-1

trong ts

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

trong html

(ảnh == không xác định | |! (isArray (ảnh) && photos.length> 0))


3
Bạn có chắc chắn về điều đó không? Phần thứ hai trông không giống HTML chút nào
Nico Haase

-3

Khi bạn tạo image_array, nó trống, do đó image_array.length của bạn là 0

Như đã nêu trong bình luận bên dưới, tôi chỉnh sửa câu trả lời của mình dựa trên câu trả lời của câu hỏi này ):

var image_array = []

bên trong các dấu ngoặc khác không thay đổi bất cứ điều gì thành image_array được xác định trước trong mã


Tôi có nó trong nguồn, khi tải trang ... Chỉ cần quên đăng.
dùng1564141

Tôi muốn thêm một cái gì đó vào câu trả lời của tôi có thể sai vì vậy tôi nêu nó ở đây. Trong các ngôn ngữ phổ biến, những gì được tạo bên trong một khối không thể nhìn thấy "bên ngoài" khối. Khi bạn xác định []var image_array = []bên trong khối khác, tôi không chắc nó có thể được nhìn thấy bên ngoài. Hãy thửimage_array = []
Al_th

nhưng nếu tôi loại bỏ image_array khỏi cái khác thì mọi thứ đều hoạt động tốt.
dùng1564141
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.