检查数组是否为空或为null。

123
我想知道如何在jQuery中检查数组是否为空或为null。我尝试了array.length === 0,但它没有起作用。它也没有抛出任何错误。
这是代码:
var album_text = new Array();

$("input[name='album_text[]']").each(function(){
  if( $(this).val() &&  $(this).val() != '') {
    album_text.push($(this).val());
  }
});
if (album_text.length === 0) {
  $('#error_message').html("Error");
}

else {
  // send data
}

2
与“普通JavaScript”相同的方式:https://dev59.com/M3E85IYBdhLWcg3wqVX5 - Julien Schmidt
1
@Julien,我在开始这个帖子之前尝试了那个帖子中列出的所有解决方案。但不知何故,它们都没有起作用。 - input
我们能否获取一些更多的代码以提供上下文?周围是 JavaScript、HTML 代码吗?你确定 $("input[name='album_text[]']") 返回的是元素吗? - Jon Adams
@JulienSchmidt:你链接的问题是关于检查数组是否为空,而不是整个数组。 - Dan Dascalescu
5个回答

190
只要你的选择器实际可用,我认为你检查数组长度的代码没有问题。那应该就能实现你想要的结果。有很多方法可以简化和提高代码的可读性。这里是一个已经过整理的版本,并注明了我所整理的内容。
var album_text = [];

$("input[name='album_text[]']").each(function() {
    var value = $(this).val();
    if (value) {
        album_text.push(value);
    }
});
if (album_text.length === 0) {
    $('#error_message').html("Error");
}

else {
  //send data
}

关于你的操作以及我所做的更改的一些说明:

  1. $(this)是一个有效的jQuery对象,因此没有必要检查if ($(this))。它可能没有任何DOM对象在内部,但是您可以通过$(this).length检查这一点,但这在这里并不必要,因为如果没有任何项目,则.each()循环将不运行,因此您.each()循环内的$(this)将始终是一些内容。
  2. 在同一个函数中多次使用$(this)是低效的。最好将其一次存储到本地变量中,然后从该本地变量中使用它。
  3. 推荐使用[]而不是new Array()来初始化数组。
  4. 如果预期value是一个字符串,那么if (value)将保护免受value == nullvalue == undefinedvalue == ""的影响,因此您不必执行if (value && (value != ""))。 您只需执行if (value)即可检查所有三个空条件。
  5. if (album_text.length === 0)将告诉您数组是否为空,只要它是一个有效的,已初始化的数组(在这里是这样的)。

您想要使用选择器$("input[name='album_text[]']")做什么?


5
我经常使用严格相等运算符(===), 除非我特别想允许类型转换,因为这是一个好习惯。请参阅 https://dev59.com/Z3RC5IYBdhLWcg3wROpQ. - jfriend00

84

用户可以使用jQuery的EmptyObject来检查数组是否包含元素。

var testArray=[1,2,3,4,5];
var testArray1=[];
console.log(jQuery.isEmptyObject(testArray)); //false
console.log(jQuery.isEmptyObject(testArray1)); //true

3
如果您的变量可以是对象(使用对象时,长度不能用于检查是否为空),则比检查长度要可靠得多。 - gaborous
在我看来,这是更合适的答案。 - earl3s
5
如果扩展了Array.prototype,例如 Array.prototype.someFunction = function () {};,即使数组为空,isEmptyObject函数始终返回false。请注意,一些框架(例如Ember.js)默认会扩展Array原型。 - jesenko
4
注意使用isEmptyObject!对于jQuery 1.8.3,jQuery.isEmptyObject([])返回false,但是对于jQuery 1.11.3则返回true。实际上,jQuery文档指出:“参数应该始终是一个普通的JavaScript对象,因为其他类型的对象(如DOM元素、原始字符串/数字、宿主对象)可能在不同的浏览器中产生不一致的结果。”抱歉,没有看到@rhinoxi的答案。 - Dmitry Vershinin

9
我认为使用jquery的$.isEmptyObject来检查数组是否为空是危险的,正如@jesenko所提到的。我刚遇到这个问题。
isEmptyObject文档中,它提到:
引用: 参数应始终是纯JavaScript对象
你可以通过$.isPlainObject来确定。 $.isPlainObject([])的返回值为false。

8

在将内容推入数组之前,您应检查''(空字符串)。您的数组包含空字符串元素。然后您的album_text.length === 0就可以正常工作。


请查看更新的代码。我添加了这段代码 if( $(this).val() && $(this).val() != ''),但它并没有起作用。 - input

4
/*
  Basic Checking with undefined array for Jquery Array
*/
if (typeof myArray !== 'undefined' && myArray.length > 0) {
    console.log('myArray is not empty.');
}else{
    console.log('myArray is empty.');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接