检查数组是否有空元素

28

我该如何检查数组中是否有空元素? 假设有这样一个数组:

var arr = [ 'a', 'b', , 'd'];

arr[2]的值为undefined。我想要检查一下。如果这个元素为空,返回'true',否则返回'false'。可能是这样:

function hasEmptyElement(array){
    for (var i=0; i<array.length; i++){
        if (typeof arr[i] == 'undefined'){
          return true; 
          // and then ?
          // should I use double for loop or helper variable?
        }
    }
}

我不知道怎么做这件事,聪明的人们,请帮帮我。


if(arr[i] == undefined) 这应该可以工作。 - Developer107
请检查!arr[i] === true是否为空。 - Citrullin
检查答案请点击这里这里 - Arnel Aves
13个回答

64

从ES2016开始,您应该使用Array.prototype.includes

const array = ["a", "b", , "d"];
array.includes(undefined); // true

(您不需要编写undefined,但这可以更清楚地说明正在发生的事情。)

请注意,此方法将值为undefined的插槽视为相同,尽管它们不同。如果您还需要区分这两种情况,则可以从ES2017开始使用Object.values使以下表达式在数组中存在空插槽时返回true

Object.values(array).length !== array.length; // true

1
你知道为什么 array.indexOf(undefined) 的结果是 -1 吗? - James
1
@James:因为array的第三个元素实际上不是undefined,而是一个空槽。然而,Array.prototype.includes将空槽和值为undefined的槽视为相同。 - Chiru
1
由于第三个插槽不为空,因此 ["a", "b", undefined, "d"] 将失败。 - vsync
@vsync:上面的答案已经指出这个问题超过半个十年了,甚至提供了一个解决方案,你看过吗? - Chiru

23

首先,注意空槽和值未定义的槽之间的区别:

var arr = [/*empty slot*/, undefined];
Object.keys(arr); // ["1"] but not "0"
"0" in arr; // false
"1" in arr; // true

ES5数组方法会跳过空槽。ES6的[].includes则不会跳过。

这意味着你可以使用

arr.includes(undefined); // has empty slot OR contains undefined value
arr.indexOf(undefined) > -1; // contains undefined value
如果您只想测试是否存在空槽,您可以手动使用 for 循环迭代,并检查数组长度之间的所有索引是否都存在,例如使用 in 运算符。
(function() {
  for(var i=0; i<arr.length; ++i) if(!(i in arr)) return true;
  return false;
})(); // has empty slot

或者你也可以使用ES5数组方法,并检查它们是否跳过了索引。

var n = 0;
arr.some((_,i) => i !== n++); // has empty slot

4

您还可以使用Array.prototype.findIndex()方法。

var arr = ['a', 'b', , 'd'];

document.write(arr.findIndex(e => e === undefined) > -1);


这解决了找到第一个空或未定义索引的问题,这是我的问题的第一部分,尽管它在技术上超出了OP的问题。感谢您再向前迈进了一步。 - Sideways S

2

尝试

var hasAnyEmptyElement = arr.filter(function(val){ return (typeof val) != "undefined" }).length != arr.length;

演示

var arr = [1,2];
arr[4] = 2;

var hasAnyEmptyElement = arr.filter(function(val){ return (typeof val) != "undefined" }).length != arr.length;

alert(hasAnyEmptyElement);


val == "undefined"? - Dmitri Pavlutin

2
你可以像这样做:
function hasEmptyElement(array){
    for (var i=0; i<array.length; i++){
        if (!(i in array)) {
            return true;
        }
    }
    return false;
}

这个实现的主要重点在于它区分了[1,,3][1, undefined, 3]

你声称它“有所不同”是不正确的。 - vsync

2
var temp = arr.filter(item => item);

这将为您提供一个包含以下元素的新数组:

["a", "b", "d"]

上述解决方案将有助于删除空值和null值。


3
由于数组中可能存在像数字0或布尔值false这样的项,所以该方法不可靠。可以使用arr.filter(item => item !== undefined).length代替。 - Dylan Maxey

1
简单实现使用集合
var arr = [ 'a', 'b', , 'd'];
// Using Set from es6
var arraySet = new Set(arr)
arraySet.has(undefined) // returns true

谢谢!


这也适用于以下内容: var arr = [ 'a', 'b', undefined]; var arraySet = new Set(arr) arraySet.has(undefined) // true - Kishor

0
你可以尝试这样做:

var arr = [ 'a', 'b',, 'd'];
function myfunc(arr) {
  for(var i=0; i<arr.length; i++) {
    if (!(i in arr)) return false;
  }
  return true;
}
alert( myfunc(arr));


我认为你应该编辑你的回答,因为它没有意义,信息也很少。 - vsync

0

对于 ES5-,你可以这样做

var arr = [ 'a', 'b', , 'd'];
arr.filter(function() { return true }).length === arr.length

如果有undefined,那么它将返回false

ES2015检查includes


1
还让我们领略一下“return true”的美妙之处。 - Rayon

0

最近我需要知道一个给定的数组元素是否为空,这个页面帮助我得出了以下解决方案:

/** Determine if an array element is empty.
 *  @param {*[]} arr
 *  @param {number} [i] If not provided, check entire arr for empty.
 *  @return {boolean}
 */
const hasEmpty = (arr, i) => 0<=i 
  ? !arr.some((_, j) => j==i) 
  : Object.values(arr).length!==arr.length;

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