检查数组是否为空或存在

对于第一页加载,我需要检查是否有image_array加载最后的形象,否则阻止预览button; 提醒用户推送新的图像button; 创build空arrays来放置图像;

问题是image_array中的image_array在触发。 如果数组存在 – 它只是覆盖它,但提醒剂量工作。

 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; ?> 
 if (typeof image_array !== 'undefined' && image_array.length > 0) { // the array is defined and has at least one element } 

由于隐式全局variables和variables提升的混合,您的问题可能会发生。 确保每当声明一个variables时使用var

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

然后确保您以后不会意外重新声明该variables:

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

检查一个数组是否为空。

显式的方式

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

紧凑的方式

  if(typeof array != "undefined" && array != null && array.length > 0){} 

CoffeeScript方式

  if array?.length > 0 

为什么?

情况未定义

未定义的variables是一个variables,你还没有分配任何东西。

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

案例空

一般来说,零是缺乏价值的状态。 例如,当您错过或未能检索某些数据时,variables为空。

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

情况不是数组

Javascript有一个dynamictypes系统。 这意味着我们不能保证一个variables拥有什么types的对象。
有一个机会,我们没有谈到Array一个实例。

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

案例空arrays

现在,我们testing了所有其他的可能性,我们正在讨论一个Array的实例。

为了确保它不是空的,我们询问它所持有的元素的数量,并确保它有多于零个元素。

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

如何(ECMA 5.1):

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

你应该使用:

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

如果你想testing图像数组variables是否已经定义,你可以这样做

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

这是我用的。 第一个条件涵盖了truthy,它既有null也有undefined。 第二个条件检查一个空数组。

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

或者感谢tsemer的评论我添加了第二个版本

 if(arrayName && arrayName.length) 

然后,我使用Firefox中的Scratchpad对第二个条件进行了testing:

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

的console.log(数组1); 的console.log(数组2); 的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!"); } 

然后结果:

未定义

[]

[“一二三”]

空值

并显示最后的testing

if(array2 && array2.length){

是相同的

if(array2 && array2.length > 0){

ARRAY3! 有一个价值!

用户JQuery是EmptyObject来检查数组是否包含元素。

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

对于我来说,当我把它们放到jsfiddle中的时候,肯定会有一些被高评价的答案“工作”,但是当我有一个dynamic生成的数组列表时,很多这样的代码在答案中就不适用于我。

这是为我工作。

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

注意,没有引号未定义,我不打扰的长度。

如果你没有声明为数组的variables,你可以创build一个检查:

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

这检查variablesx是否存在,如果是,检查它是否是一个填充数组。 否则它创build一个空的数组(或者你可以做其他的东西);

如果你确定有一个数组variables创build有一个简单的检查:

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

您可以在这里查看我的小提琴显示最可能的方法来检查数组。

当你创build你的image_array,它是空的,因此你的image_array.length是0

正如下面的评论所述,我编辑我的答案根据这个问题的答案 ):

 var image_array = [] 

里面的其他括号不会改变任何代码中定义的image_array

你应该做这个

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

尝试下面,

 if(array.results != undefined) - specific to SharePoint 

要么

 if(array.length > 0) 

我在Javascript中遇到过这个问题。 对我来说,最好的办法是在检查长度之前进行非常广泛的检查。 我在这个问答中看到了一些其他的解决scheme,但我希望能够检查nullundefined或其他任何错误的值。

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

这将首先检查undefinednull值或其他错误的值。 如果其中任何一个是真的,它将完成布尔值,因为这是一个OR 。 然后,可以检查array.length更危险的检查,如果数组未定义,可能会出错。 如果array undefined或为null ,这将永远不会达到,因此条件的sorting非常重要。

使用意外或lodash :

_.isArray(image_array) && !_.isEmpty(image_array)

一个简单的方法,如果不存在,不会导致exception并转换为布尔值:

 !!array 

例:

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

这里是我的要添加到长长的答案列表:

首先,检查length是不足以检查types,因为

 const fakeArray1 = { length: "very long" }; const fakeArray2 = { length: "1337", data: {} }; if (fakeArray1.length) {...} // is true if (fakeArray2.length > 0) {...} // is also true 

所以你需要检查真实的types

image_array.constructor === ArrayArray.isArray(image_array)

现在魔法(注:在JS中使用魔法是危险的,需要灵巧和责任) ,当使用无types比较时,下面的任何一对等式都是truthy

[] == false; [] == 0; [] == ''; [null] == false

所以! 这正在退出:P

我的答案

 if(Array.isArray(image_array) && image_array == false) { // handle the case where, either // - the array don't exist // - the array is empty // - it contains only one empty element } 

注意:(和build议)

使用无types检查在JS中被认为是不好的做法,有人可能想要添加第三个= ,改变你的代码的行为。 我build议然后把这个检查包装在一个util函数中,这样它就不会进入你的逻辑,并被同行所理解。