检查数组是否为空或存在
对于第一页加载,我需要检查是否有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,但我希望能够检查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
,这将永远不会达到,因此条件的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 === Array
或Array.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函数中,这样它就不会进入你的逻辑,并被同行所理解。