如何检查JavaScript数组是否包含空字符串?

18
我需要检查数组是否至少包含一个空元素。如果任何一个元素为空,则返回false。
例如:
var my_arr = new Array(); 
my_arr[0] = ""; 
my_arr[1] = " hi ";
my_arr[2] = "";
第0和第2个数组元素是“空的”。

你所说的“empty”是指“undefined”还是空字符串? - Telemachus
这是一个Java问题还是JavaScript问题?它们完全没有关联。哦,现在看起来像是PHP,有那么多的$符号。你得下定决心了... - Michael Borgwardt
2
Santanu,你刚刚发的那段代码是PHP,不是JavaScript。 - Johannes Jensen
2
@santanu:我把你的代码转换成了JavaScript并添加到了你的问题中。 - Andy E
@Michael:它始于$my_arr = array();。*array()在ECMAScript/JavaScript中未定义,除非您自己定义它。array()*是PHP数组的构造函数。 - Andy E
显示剩余3条评论
18个回答

20

您可以通过使用简单的 for 循环遍历数组来检查,如下所示:

function NoneEmpty(arr) {
  for(var i=0; i<arr.length; i++) {
    if(arr[i] === "") return false;
  }
  return true;
}

你可以在这里试一试,我们之所以没有使用.indexOf()是因为IE不支持,否则它会更简单,像这样:

function NoneEmpty(arr) {
  return arr.indexOf("") === -1;
}

但是遗憾的是,IE目前还不支持在数组上使用这个函数。


这不是与 OP 所要求的相反吗?(如果数组仅包含空元素则返回 true,而不是如果任何元素为空则返回 false) - Telemachus
使用indexOf来查找数组是个好主意。现在只希望IE开发团队中的某个人能够阅读并修复它! - fredrik
@Telemachus - 很好的发现,我错过了他明确的“结果为假”的要求,已经更新 :) - Nick Craver
如果我们将 isEmpty 函数作为 HasEmpty 的第二个参数,并将 arr[i] === "" 实现作为默认值,那不是更好吗? - satoru
说实话,在我们可以放弃支持<IE8之前,FWIW可能并没有太大的作用,但是IE9将支持*indexOf()*和其他ECMAScript第5个数组函数。http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx - Andy E
如果 indexOf 存在,您仍然可以使用它:var arrayHasEmpty = Array.prototype.indexOf ? function(arr) { return arr.indexOf("") != -1; } : function(arr) { /* for loop stuff here */ }; - Tim Down

16

你需要通过循环进行检查。

function checkArray(my_arr){
   for(var i=0;i<my_arr.length;i++){
       if(my_arr[i] === "")   
          return false;
   }
   return true;
}

8

您可以尝试使用jQuery.inArray()函数:

return jQuery.inArray("", my_arr)

5
这个似乎只为了加入jQuery有点过头了,你不觉得吗? - Nick Craver
3
@Nick Craver - 如果这是使用jQuery的唯一原因,那么这样做可能有些过度。但另一方面,如果使用jQuery,这是一个好的解决方案 :-) - gnud
@Vitalii - 有时候会使用它,但仍然是少数人,我的观点是,你应该在一个没有标记jQuery的问题上限定这种类型的答案,比如说,“如果你已经在使用jQuery...”。一个后来发现这个问题并仅因为这个原因加入jQuery的初学者是不好的。 - Nick Craver
@Vitalii - 我想你误解了,我指的是JS新手,而不是SO(Stack Overflow)的新手。根据定义,他们不知道什么是最好的 :) - Nick Craver

5

使用像"高阶函数"这样的函数,例如filter,而不是循环,有时可以使代码更快、更安全、更易读。在这里,您可以过滤数组以删除不是空字符串的项,然后检查结果数组的长度。

基本JavaScript

var my_arr = ["", "hi", ""]

// only keep items that are the empty string
new_arr = my_arr.filter(function(item) {
  return item === ""
})

// if filtered array is not empty, there are empty strings
console.log(new_arr);
console.log(new_arr.length === 0);

现代JavaScript:一行代码实现

var my_arr = ["", "hi", ""]
var result = my_arr.filter(item => item === "").length === 0
console.log(result);

关于性能的注意事项

在这种情况下,循环可能更快,因为可以在找到空字符串时立即停止循环。我可能仍然选择使用filter来使代码简洁易读,但任何一种策略都是可辩解的。

然而,如果您需要遍历数组中的所有元素--也许是为了检查是否每个项都是空字符串--那么filter通常比for循环快得多!


4

现在我们可以使用 Array.includes

my_arr.includes("")

返回布尔值。

3
你可以为此编写一个简单的帮助方法:

你可以为此编写一个简单的帮助方法:

function hasEmptyValues(ary) {
    var l = ary.length,
        i = 0;

    for (i = 0; i < l; i += 1) {
        if (!ary[i]) {
            return false;
        }
    }

    return true;
}

//check for empty
var isEmpty = hasEmptyValues(myArray);

编辑:这个检查包括falseundefinedNaNnull""0

编辑2:误读了true/false的期望。

..fredrik


3
function containsEmpty(a) {
    return [].concat(a).sort().reverse().pop() === "";
}
alert(containsEmpty(['1','','qwerty','100'])); // true
alert(containsEmpty(['1','2','qwerty','100'])); // false

2
my_arr.includes("")

这里返回的是undefined而不是布尔值,所以这里提供一种替代方案

function checkEmptyString(item){
     if (item.trim().length > 0) return false;
     else return true;
    };
    
function checkIfArrayContainsEmptyString(array) {
  const containsEmptyString = array.some(checkEmptyString);
  return containsEmptyString;
};
    
console.log(checkIfArrayContainsEmptyString(["","hey","","this","is","my","solution"]))
// *returns true*

console.log(checkIfArrayContainsEmptyString(["yay","it","works"]))
// *returns false*


2
yourArray.join('').length > 0

将数组连接在一起,中间不留任何空格,并检查其长度。如果长度大于零,则表示该数组不为空。如果长度小于或等于零,则表示该数组为空。


1
尽管这段代码可以解决问题,但是附上解释说明这样做的原因和方法,能够极大地提高您的帖子质量,并且很可能会得到更多赞。请记住,您的答案不仅是为了回答当前提问者的问题,也是为未来的读者提供帮助。请编辑您的回答,添加解释说明并指出任何限制和假设条件。 - fcdt

1

我在您的问题下面的评论中看到您提供的代码示例是PHP,所以我想知道您是否真的要使用PHP?在PHP中,它应该是这样的:

function hasEmpty($array)
{
  foreach($array as $bit)
  {
    if(empty($bit)) return true;
  }

  return false;
}

否则,如果您确实需要JavaScript,我建议参考Nick Craver的答案。

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