检查数组是不是为空或存在
Posted
技术标签:
【中文标题】检查数组是不是为空或存在【英文标题】:Check if an array is empty or exists检查数组是否为空或存在 【发布时间】:2012-07-29 09:55:07 【问题描述】:第一次加载页面时,我需要检查image_array
中是否有图片并加载最后一张图片。
否则,我禁用预览按钮,提醒用户按下新图像按钮并创建一个空数组来放置图像;
问题是else
中的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; ?>
【问题讨论】:
控制台日志image_array
- 你得到了什么?
@Utkanos if 有 var image_array = [] - undefined if //var image_array = [] (commented) - real array.
array?.length - 得到广泛支持,很快就会成为原生功能
【参考方案1】:
if (typeof image_array !== 'undefined' && image_array.length > 0)
// the array is defined and has at least one element
您的问题可能是由于隐式全局变量和变量提升的混合而发生的。确保在声明变量时使用var
:
<?php echo "var image_array = ".json_encode($images);?>
// add var ^^^ here
然后确保以后不会意外地重新声明该变量:
else
...
image_array = []; // no var here
【讨论】:
不。当 image_array 为空时,这将爆炸。墨菲定律指出,总有一天会的。image_array.length
还不够吗? (不指定>0
)
好奇:你能找到任何使用@JamesDrinkard 的答案会破坏的用例吗?
if (image_array && image_array.length) // array exists and has elements
let image_array = new Array(10);
失败。【参考方案2】:
检查数组是否为空
现代方式,ES5+:
if (Array.isArray(array) && array.length)
// array exists and is not empty
一种老式的方式:
typeof array != "undefined"
&& array != null
&& array.length != null
&& array.length > 0
一种紧凑的方式:
if (typeof array != "undefined" && array != null && array.length != null && array.length > 0)
// array exists and is not empty
一种 CoffeeScript 方式:
if array?.length > 0
为什么?
大小写未定义 未定义变量是您尚未为其分配任何内容的变量。
let array = new Array(); // "array" !== "array"
typeof array == "undefined"; // => true
案例无效 一般来说,null 是缺少值的状态。例如,当您错过或未能检索到某些数据时,变量为空。
array = searchData(); // can't find anything
array == null; // => true
大小写不是数组
Javascript 有一个动态类型系统。这意味着我们不能保证一个变量持有什么类型的对象。我们有可能不是在与Array
的实例交谈。
supposedToBeArray = new SomeObject();
typeof supposedToBeArray.length; // => "undefined"
array = new Array();
typeof array.length; // => "number"
大小写空数组
现在,由于我们测试了所有其他可能性,我们正在与Array
的实例交谈。为了确保它不为空,我们会询问它所包含的元素数量,并确保它的元素数量大于零。
firstArray = [];
firstArray.length > 0; // => false
secondArray = [1,2,3];
secondArray.length > 0; // => true
【讨论】:
请注意,仅检查(typeof array != "undefined" && array.length > 0)
是不够的,因为如果array
为空,我们将得到TypeError: Cannot read property 'length' of null
。
也许用 || 改变 &&
!(typeof array !== "undefined") || !(array.length > 0)
?刚刚试了一下,同样的错误。你能给我们一个完整的例子来说明如何使用||
吗?
我的意思是(typeof array != "undefined" || array.length > 0)
感谢您的澄清。如果array = null
,(typeof array != "undefined" || array.length > 0)
返回true
。如果array = [1,2]
,!(typeof array != "undefined" || array.length > 0)
返回false
。很抱歉不理解,但@Elsa 你能提供一个工作示例吗?提前致谢。【参考方案3】:
怎么样(ECMA 5.1):
if(Array.isArray(image_array) && image_array.length)
// array exists and is not empty
【讨论】:
回复.. && image_array.length)
。恕我直言,虽然您可以安全地依赖 JS 的松散类型,将 0
整数转换为 false
并将 non-zero
整数转换为 true
,但我认为它更可取,以便在未来,“说出你的意思”。我会做.. && image_array.length > 0)
。【参考方案4】:
这是我使用的。第一个条件涵盖了truthy,它同时具有null 和undefined。第二个条件检查一个空数组。
if(arrayName && arrayName.length > 0)
//do something.
或者感谢 tsemer 的评论,我添加了第二个版本
if(arrayName && arrayName.length)
然后我对第二个条件进行了测试,在 Firefox 中使用 Scratchpad:
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!");
这也证明if(array2 && array2.length)
和if(array2 && array2.length > 0)
完全一样
【讨论】:
我觉得这是最简洁的,涵盖了所有异常问题。既然你喜欢真实,甚至可以凑合if (arrayName && arrayName.length)
短而快!我花了一段时间从 C# 来习惯 if(obj) 来检查 null,但现在我喜欢它: if(obj) // null check; if(array && array.length) // 数组 null 或空检查; if(array && !array.length) // 数组存在,但空检查; if(str) // 字符串不为空且不为空。唯一的问题是,如果零是有效数字,则不要在数字上使用。
我一直在使用 (arrayName && arrayName.length) 一段时间,然后我担心它是否有问题。这个答案安慰了我,谢谢:)
在 Typescript 中存在细微差别,至于var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0
isNotEmpty 的类型不会是布尔值,而是布尔值|未定义。
同意@Koray,这值得更多支持!【参考方案5】:
optional chaining
随着可选链提案进入第 4 阶段并获得更广泛的支持,有一种非常优雅的方法可以做到这一点
if(image_array?.length)
// image_array is defined and has at least one element
【讨论】:
这晚饭真的很好吃 直截了当的回答!【参考方案6】:你应该使用:
if (image_array !== undefined && image_array.length > 0)
【讨论】:
【参考方案7】:如果你想测试图像数组变量是否已经定义,你可以这样做
if(typeof image_array === 'undefined')
// it is not defined yet
else if (image_array.length > 0)
// you have a greater than zero length array
【讨论】:
不工作dl.dropbox.com/u/14396564/screens/… @user1564141 很难分辨相对于您设置的 image_array 函数的声明位置。您可能遇到了托管问题,因此您可能需要将该变量声明为 var index_array = ... 此外,您设置 index_array 的脚本标记是关闭的。从截图中看不是这样。 在 else 中也是警报,只有当数组为空时才会触发,但 var image_array 每次都有效......我不明白为什么? @user1564141 如果您可以更新您的问题以将源显示为输出,这将有所帮助。我仍然不知道您的 if-else 逻辑相对于您的 index_array 声明的位置在源中的位置。【参考方案8】:JavaScript
( typeof(myArray) !== 'undefined' && Array.isArray(myArray) && myArray.length > 0 )
Lodash 和下划线
( _.isArray(myArray) && myArray.length > 0 )
【讨论】:
【参考方案9】:您可以使用jQuery的isEmptyObject()
来检查数组是否包含元素。
var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true
来源:https://api.jquery.com/jQuery.isEmptyObject/
【讨论】:
这是在使用 array.push() 添加元素时唯一对我有用的东西——来自动态添加的元素(ajax)。谢谢【参考方案10】:一种简单的方法,如果不存在则不会导致异常并转换为布尔值:
!!array
例子:
if (!!arr)
// array exists
【讨论】:
【参考方案11】:使用undescore 或lodash:
_.isArray(image_array) && !_.isEmpty(image_array)
【讨论】:
【参考方案12】:这个怎么样?检查未定义数组的长度可能会引发异常。
if(image_array)
//array exists
if(image_array.length)
//array has length greater than zero
【讨论】:
使用&&
可以避免嵌套的if
,如image_array && image_array.length
,如果image_array
不存在则会短路。【参考方案13】:
最好是这样检查:
let someArray: string[] = [];
let hasAny1: boolean = !!someArray && !!someArray.length;
let hasAny2: boolean = !!someArray && someArray.length > 0; //or like this
console.log("And now on empty......", hasAny1, hasAny2);
查看完整示例列表:
【讨论】:
【参考方案14】:我在 Javascript 中经常遇到这个问题。对我来说,最好的方法是在检查长度之前进行非常广泛的检查。我在此问答中看到了一些其他解决方案,但我希望能够检查 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
,这将永远无法达到,因此条件的顺序非常重要。
【讨论】:
【参考方案15】:如果您没有将变量声明为数组,您可以创建一个检查:
if(x && x.constructor==Array && x.length)
console.log("is array and filed");
else
var x= [];
console.log('x = empty array');
这会检查变量 x 是否存在,如果存在,则检查它是否是一个填充数组。否则它会创建一个空数组(或者你可以做其他事情);
如果您确定创建了一个数组变量,则进行简单检查:
var x = [];
if(!x.length)
console.log('empty');
else
console.log('full');
您可以查看my fiddle here,其中显示了检查数组的最可能方法。
【讨论】:
【参考方案16】:对我来说,当我将一些高评价的答案放入 jsfiddle 时,它们肯定“有效”,但是当我有一个动态生成的数组列表数量时,答案中的很多此代码对我不起作用。
这对我有用。
var from = [];
if(typeof from[0] !== undefined)
//...
注意,未定义周围没有引号,我不关心长度。
【讨论】:
两个 cmets:1)typeof
返回一个字符串,与 undefined
相比总是很脆弱 2) 你不检查 from
是否已定义。如果不是,您上面的代码将引发错误【参考方案17】:
以下是我包装在一个函数中的解决方案,该函数也抛出 管理对象范围和所有类型的几个问题的错误 传递给函数的可能数据类型。
这是我用来检查这个问题的小提琴 (source)
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);
【讨论】:
【参考方案18】:你应该这样做
if (!image_array)
// image_array defined but not assigned automatically coerces to false
else if (!(0 in image_array))
// empty array
// doSomething
【讨论】:
【参考方案19】:可能您的 image_array
不是数组,而是带有 length
属性的一些 OBJECT(如字符串) - 试试
if(image_array instanceof Array && image_array.length)
function test(image_array)
if(image_array instanceof Array && image_array.length)
console.log(image_array,'- it is not empty array!')
else
console.log(image_array,'- it is empty array or not array at all!')
test(length:5);
test('undefined');
test([]);
test(["abc"]);
【讨论】:
【参考方案20】:在我的例子中,array_.length
总是返回 0,即使它里面有值。可能是因为非默认索引。
所以要检查是否定义了数组,我们使用typeof _array !== 'undefined'
然后检查它是否包含任何日期,我只需将它与一个空数组进行比较 _array !== []
【讨论】:
【参考方案21】:我发现的工作方式(来自另一种语言)是制作一个简单的函数来测试。
创建一个检查数组大小并通过参数传递长度的函数。
isEmpty(size)
if(size==0)
return true;
else
return false;
//then check
if(isEmpty(yourArray.length)==true)
//its empty
else
//not empty
【讨论】:
【参考方案22】:在ts中
isArray(obj: any)
return Array.isArray(obj)
在html中
(photos == undefined || !(isArray(photos) && photos.length > 0))
【讨论】:
你确定吗?第二部分毕竟不像 HTML【参考方案23】:当您创建 image_array 时,它是空的,因此您的 image_array.length 为 0
正如下面评论中所述,我根据question's answer 编辑我的答案:
var image_array = []
else 括号内不会对之前在代码中定义的 image_array 进行任何更改
【讨论】:
我有它的源,加载页面时...忘记发布。 我想在我的答案中添加一些可能是错误的东西,所以我在这里说明。在通用语言中,在块内创建的内容在块“外部”是不可见的。当您在 else 块内定义[]var image_array = []
时,我不确定它是否可以在外面看到。试试image_array = []
但如果我从 else 中删除 image_array 一切正常。以上是关于检查数组是不是为空或存在的主要内容,如果未能解决你的问题,请参考以下文章