检查数组是否为空或存在


358

首次加载页面时,我需要检查其中是否有图像image_array并加载最后一张图像。

否则,我将禁用预览按钮,提醒用户按下新图像按钮,并创建一个空数组来放置图像;

问题是,image_arrayelse火灾所有的时间。如果存在数组-它将覆盖它,但警报不起作用。

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)

@Utkanos,如果有var image_array = []-如果// var image_array = [](未定义),则为未定义-实数数组。
user1564141

array?.length-广泛支持,并将很快成为本机功能
Anbu Agarwal

Answers:


515
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
}

33
不。当image_array为null时,它将爆炸。墨菲定律规定有一天会发生。
Marco Faustinelli 2015年

7
image_array.length不够吗 (未指定>0
mcont

好奇:您能否找到任何用@JamesDrinkard回答都无法解决的用例?
tsemer '16

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

195

检查数组是否为空

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

Case Null
通常来说,null是缺少值的状态。例如,当您丢失或无法检索某些数据时,变量为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"

Case空数组
现在,由于我们测试了所有其他可能性,因此我们正在讨论的实例Array。为了确保它不为空,我们询问它所持有的元素数,并确保它具有不止零个元素。

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

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

8
请注意,这是足够的,只是检查(typeof array != "undefined" && array.length > 0),因为如果array是零,我们会得到TypeError: Cannot read property 'length' of null
Pooyan Khosravi 2014年

也许用||更改&&
Sahar Ch。

!(typeof array !== "undefined") || !(array.length > 0)?刚刚尝试过,遇到了同样的错误。您能给我们一个完整的用法示例||吗?
Pooyan Khosravi 2014年

我的意思是(typeof array != "undefined" || array.length > 0)
Sahar Ch。

感谢您的澄清。(typeof array != "undefined" || array.length > 0)返回true如果array = null!(typeof array != "undefined" || array.length > 0)返回false如果array = [1,2]。对不起,您还不了解,但是@Elsa可以提供一个有效的示例吗?提前致谢。
Pooyan Khosravi 2014年

70

怎么样(ECMA 5.1):

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

1
.. && image_array.length)。恕我直言,当你可以安全地依赖JS宽松的打字,要转换0到整数falsenon-zero为整true,我认为这是最好,在未来的可读性,以“说你是什么意思”。我会的.. && image_array.length > 0)
制造商史蒂夫(Steve),

28

这就是我用的。第一个条件包括真实性,其为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)在做同样的事情


13
我发现这是最简洁的方法,涵盖了所有异常问题。而且由于您喜欢真实性,甚至可以解决if (arrayName && arrayName.length)
tsemer '16

2
简短而快速!我花了一段时间从C#习惯了if(obj)检查null,但现在我喜欢它:if(obj)// null检查;if(array && array.length)//数组为null或为空的检查;if(array &&!array.length)//数组存在,但是空检查;if(str)//字符串不为null且不为空。唯一的陷阱是,如果有效数字为零,则不要在数字上使用。
里克·洛夫

1
我已经使用(arrayName && arrayName.length)一段时间了,然后我担心它是否可能有问题。谢谢,这个回答使我感到安慰:)
Koray

在Typescript中有细微差别,因为var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0isNotEmpty的类型不是boolean,而是boolean | undefined。
Giedrius

15

您应该使用:

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

8

如果要测试是否已定义图像数组变量,可以这样进行

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很难确定相对于您设置的image_array在哪里声明了函数。您可能遇到托管问题,因此可能需要将该变量声明为var index_array =...。此外,在脚本标签中设置index_array处于关闭状态。从屏幕截图来看,它不是这样。
Mike Brant 2012年

在else中也很警惕,仅当array为空时才触发,但是var image_array每次都起作用...我不明白为什么?
user1564141

@ user1564141如果您可以更新问题以将源显示为输出,则将有所帮助。对于您的if-else逻辑相对于index_array声明的位置在源内的位置,我仍然感觉不到。
Mike Brant 2012年


6

您可以使用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/


这是从动态添加的元素(ajax)使用array.push()添加元素时对我唯一有效的方法。谢谢
TomoMiha

3

一种简单的方法,如果不存在则不会导致异常,并转换为布尔值:

!!array

例:

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

3

这个怎么样 ?检查未定义数组的长度可能会引发异常。

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

if可以使用来避免嵌套&&,如中所述image_array && image_array.length,如果image_array不存在,则会短路。
rvazquezglez

3

对我来说,当我将它们放入jsfiddle时,肯定会获得一些高评价的答案“有效”,但是当我动态生成大量数组列表时,答案中的许多此类代码对我来说都不起作用。

这就是对我有用的。

var from = [];

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

请注意,在未定义的地方没有引号,而且我对长度不感到困扰。


1
两条评论:1)typeof返回一个字符串,undefined与之进行比较将总是脆弱2)您不检查是否from已定义。如果不是,您的上述代码将引发错误
-Xeltor

@Xeltor不,不会。请提供您的jsfiddle或plunker证明这一点或删除您的评论。
汤姆·斯蒂克'19

@Xeltor,只看了一下,似乎您的回答为-2,并充满了以粗体表示您是错误的人的评论。
汤姆·斯蒂克'19

3

可选链接

随着可选的链接建议到达阶段4并获得广泛支持,有一种非常优雅的方法

if(image_array?.length){

  // image_array is defined and has at least one element

}

2

我在Javascript中遇到了很多这个问题。对我来说,最好的方法是在检查长度之前进行非常广泛的检查。我看到这个Q&A的一些其他的解决方案,但我希望能够检查或者null或者undefined或者其他虚假的价值。

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

这将首先检查undefinednull或其他假值。如果其中任何一个为真,则它将完成布尔值,因为这是一个OR。然后array.length,可以检查风险更大的检查,如果未定义数组,可能会给我们带来错误。如果arrayis undefinednull,将永远无法达到,因此条件的排序非常重要。



1

以下是我包装在一个函数中的解决方案,该函数还会引发错误,以处理对象范围和传递给该函数的所有可能数据类型的几个问题。

这是我用来研究这个问题的小提琴(来源

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

如果没有声明为数组的变量,则可以创建检查:

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');
}

您可以在这里检查我的小提琴,其中显示了检查数组的大多数可能方法。


0

你应该做这个

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

-1

在ts

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

在HTML

(照片==未定义||!(isArray(photos)&& photos.length> 0))


3
你确定吗?第二部分毕竟看起来并不像HTML
Nico Haase

-3

创建image_array时,它为空,因此image_array.length为0

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

var image_array = []

else括号内的内容不会更改代码中之前定义的image_array


加载页面时,我在源代码中有此文件。
user1564141

我想在我的答案中添加可能是错误的内容,因此在此声明。在普通语言中,在块内部创建的内容在该块“外部”不可见。当您[]var image_array = []在else块中定义时,我不确定是否可以在外部看到它。试试image_array = []
Al_th 2012年

但是,如果我从其他地方删除image_array,一切正常。
user1564141
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.