检查数组是不是为空或存在

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 还不够吗? (不指定&gt;0 好奇:你能找到任何使用@JamesDrinkard 的答案会破坏的用例吗? if (image_array &amp;&amp; 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" &amp;&amp; array.length &gt; 0)不够的,因为如果array 为空,我们将得到TypeError: Cannot read property 'length' of null 也许用 || 改变 && !(typeof array !== "undefined") || !(array.length &gt; 0)?刚刚试了一下,同样的错误。你能给我们一个完整的例子来说明如何使用||吗? 我的意思是(typeof array != "undefined" || array.length &gt; 0) 感谢您的澄清。如果array = null(typeof array != "undefined" || array.length &gt; 0) 返回true。如果array = [1,2]!(typeof array != "undefined" || array.length &gt; 0) 返回false。很抱歉不理解,但@Elsa 你能提供一个工作示例吗?提前致谢。【参考方案3】:

怎么样(ECMA 5.1):

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

【讨论】:

回复.. &amp;&amp; image_array.length)。恕我直言,虽然您可以安全地依赖 JS 的松散类型,将 0 整数转换为 false 并将 non-zero 整数转换为 true,但我认为它更可取,以便在未来,“说出你的意思”。我会做.. &amp;&amp; image_array.length &gt; 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 &amp;&amp; array2.length)if(array2 &amp;&amp; array2.length &gt; 0) 完全一样

【讨论】:

我觉得这是最简洁的,涵盖了所有异常问题。既然你喜欢真实,甚至可以凑合if (arrayName &amp;&amp; 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 &amp;&amp; array.length &gt; 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) &amp;&amp; !_.isEmpty(image_array)

【讨论】:

【参考方案12】:

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

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

【讨论】:

使用&amp;&amp;可以避免嵌套的if,如image_array &amp;&amp; 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 中经常遇到这个问题。对我来说,最好的方法是在检查长度之前进行非常广泛的检查。我在此问答中看到了一些其他解决方案,但我希望能够检查 nullundefined 或任何其他错误值。

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

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

【讨论】:

【参考方案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 一切正常。

以上是关于检查数组是不是为空或存在的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - 检查数组是不是为空或具有属性

在我添加错误消息以检查 CapNum 是不是为空或已存在于数据库中之前,我的代码一直在工作

如何检查 MySQL 中的列是不是为空或 null?

检查对象中的值是不是为空或空javascript

如何检查数据读取器是不是为空或为空

检查所有三列是不是不为空或为空