检查数组是否为空或存在

IT技术 javascript jquery arrays
2021-01-12 15:42:37

当页面第一次加载时,我需要检查是否有图像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; ?>
6个回答
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
}
if (image_array && image_array.length){ // array exists and has elements
2021-03-13 15:42:37
好奇:你能找到任何使用@JamesDrinkard 的答案会破坏的用例吗?
2021-03-18 15:42:37
不。这将在 image_array 为空时爆炸。墨菲定律说,总有一天它会。
2021-04-03 15:42:37
image_array.length不够吗?(不指定>0
2021-04-05 15:42:37
这对于let image_array = new Array(10);.
2021-04-05 15:42:37

检查数组是否为空

一种现代方式,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

为什么?

Case Undefined
未定义变量是您尚未为其分配任何内容的变量。

let array = new Array();     // "array" !== "array"
typeof array == "undefined"; // => true

Case Null
一般来说,null 是缺少值的状态。例如,当您错过或无法检索某些数据时,变量为空。

array = searchData();  // can't find anything
array == null;         // => true

Case Not an Array
Javascript 有一个动态类型系统。这意味着我们不能保证变量持有什么类型的对象。我们有可能不是在与Array.

supposedToBeArray =  new SomeObject();
typeof supposedToBeArray.length;       // => "undefined"

array = new Array();
typeof array.length;                   // => "number"

Case Empty Array
现在,由于我们测试了所有其他可能性,我们正在讨论Array. 为了确保它不为空,我们询问它持有的元素数量,并确保它有多个元素。

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

secondArray = [1,2,3];
secondArray.length > 0; // => true
我的意思是 (typeof array != "undefined" || array.length > 0)
2021-03-14 15:42:37
也许用 || 改变 &&
2021-03-26 15:42:37
!(typeof array !== "undefined") || !(array.length > 0)? 刚刚试了一下,同样的错误。你能给我们一个完整的例子来说明如何使用||吗?
2021-03-26 15:42:37
感谢您的澄清。(typeof array != "undefined" || array.length > 0)返回true如果array = null!(typeof array != "undefined" || array.length > 0)返回false如果array = [1,2]对不起,不明白,但@Elsa 你能提供一个有效的例子吗?提前致谢。
2021-03-26 15:42:37
请注意,这是足够的,只是检查(typeof array != "undefined" && array.length > 0),因为如果array是零,我们会得到TypeError: Cannot read property 'length' of null
2021-04-10 15:42:37

怎么样(ECMA 5.1):

if(Array.isArray(image_array) && image_array.length){
  // array exists and is not empty
}
.. && image_array.length)恕我直言,当你可以安全地依赖JS宽松的打字,要转换0到整数falsenon-zero为整true,我认为这是最好,在未来的可读性,以“说你是什么意思”。我愿意.. && image_array.length > 0)
2021-04-08 15:42:37

这就是我使用的。第一个条件涵盖了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)正在做同样的事情

又短又快!我花了一段时间从 C# 开始习惯 if(obj) 检查 null,但现在我喜欢它: if(obj) // null check; if(array && array.length) // 数组 null 或空检查;if(array && !array.length) // 数组存在,但为空检查;if(str) // 字符串非空且非空。唯一的问题是如果零是有效数字,则不要在数字上使用。
2021-03-16 15:42:37
我发现这是最简洁的,涵盖了所有异常问题。既然你喜欢真实,甚至可以凑合if (arrayName && arrayName.length)
2021-03-18 15:42:37
同意@Koray,这值得更多赞成!
2021-03-22 15:42:37
我一直在使用 (arrayName && arrayName.length) 一段时间然后我担心它是否有问题。这个答案安慰了我,谢谢:)
2021-04-03 15:42:37
在 Typescript 中存在细微差别,至于var arrayName = undefined; var isNotEmpty = arrayName && array.length > 0isNotEmpty 的类型不是布尔值,而是布尔值|未定义。
2021-04-09 15:42:37

可选链接

随着可选链提案达到第 4 阶段并获得更广泛的支持,有一种非常优雅的方法可以做到这一点

if(image_array?.length){

  // image_array is defined and has at least one element

}
直截了当的回答!
2021-03-22 15:42:37
这其实很好吃
2021-03-26 15:42:37