【问题标题】: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 - 得到广泛支持,很快就会成为原生功能

标签: javascript php jquery arrays


【解决方案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
    }
    

    【讨论】:

    • @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】:

        使用undescorelodash

        _.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 一切正常。
                          猜你喜欢
                          • 2022-10-20
                          • 2011-11-04
                          • 2013-02-24
                          • 2014-08-05
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-08-15
                          相关资源
                          最近更新 更多