如何检查JavaScript是否在某个数组索引处存在值?


521

这将用于测试位置“索引”处的值是否存在或是否有更好的方法:

if(arrayName[index]==""){
     // do stuff
}

6
请注意,不想检查整个数组是否为空,只是要检查索引值为“ index”的某个位置
Ankur 2010年

可以通过说“如何在JavaScript中检查某个数组索引中是否存在值”来改善标题。
demisx

Answers:


738

从概念上讲,JavaScript中的数组包含array.lengtharray[0]直到的元素array[array.length - 1]。如果索引介于之间(包括两端),i则将具有索引的数组元素定义为数组的一部分。如果我不在此范围内,则不在数组中。i0array.length - 1

因此,从概念上讲,数组是线性的,从零开始并达到最大值,而没有任何机制可以使在没有条目的那个范围内具有“间隙”。要找出给定位置索引(索引为0或正整数)是否存在值,您只需使用

if (i >= 0 && i < array.length) {
  // it is in array
}

现在,在引擎盖下,JavaScript引擎几乎肯定不会像这样线性且连续地分配数组空间,因为在动态语言中这没有多大意义,并且对于某些代码而言效率不高。它们可能是哈希表或策略的某种混合体,并且数组的未定义范围可能未分配给它们自己的内存。但是,JavaScript语言希望将array.length n的数组表示为具有n个成员,它们的名称为0n-1,并且此范围内的任何内容都是该数组的一部分。

但是,您可能想知道的是,数组中的值是否实际上是已定义的内容 -即不是undefined。也许你甚至想知道,如果它的定义,不是null。可以在不设置成员值的情况下将其添加到数组中:例如,如果通过增加array.length属性来添加数组值,则任何新值将为undefined

确定给定值是否有意义或已定义。也就是说,不是 undefinednull

if (typeof array[index] !== 'undefined') {

要么

if (typeof array[index] !== 'undefined' && array[index] !== null) {

有趣的是,由于JavaScript的比较规则,我的最后一个示例可以优化为:

if (array[index] != null) {
  // The == and != operators consider null equal to only null or undefined
}  

6
OP很可能知道他/他正在处理哪种数组,但仅仅是出于完整性考虑:类数组对象通常还包含一个length属性,在这种情况下,后两个示例更为合适。
贾斯汀·约翰逊

9
您可以随时替换foo !== 'undefined' && foo !== nullfoo != null
thinklinux 2012年

1
@TheComposer根据语言在Javascript中由array.length定义了数组的大小,并且据说该数组包含从0to到的所有元素array.length - 1。但是,并非所有这些值都是定义值。如果在数组成员上使用delete关键字,它将将该成员设置回未定义状态,就像您通过增加其array.length参数扩展数组一样,新值将以未定义状态开始。实际上,JavaScript实现可能会优化数组存储,并且某些或所有未定义的值可能不会占用任何内存。
thomasrutter 2014年

1
array.length不会迭代任何内容,它只是一个数字。
thomasrutter

1
此答案不涉及未设置数组索引的情况。 new Array(1)[0] === undefined但该值为空。 [undefined][0] === undefined但该值已设置;数组一个值。唯一完美的答案被使用inhasOwnProperty()- idx in arrayarray.hasOwnProperty(idx):--per这个答案stackoverflow.com/a/39171620/3120446
dx_over_dt

350

我们不能只是这样做:

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

10
问题是关于如何测试数组的特定索引是否存在。
thomasrutter 2014年

26
请问if(arrayName.length) {...有什么区别?
siannone 2015年

10
为什么这么多投票?这显然不能回答问题。
algiogia '16

10
if(arrayName.length) {...失败null
罗尼·罗斯顿

5
这个失败,[undefined, undefined]这与长度= 2的阵列
Soldeplata Saketos

41

仅使用.length不安全,并且会在某些浏览器中导致错误。这是一个更好的解决方案:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

或者,我们可以使用:

Object.keys(__array__).length

2
«请注意,不想检查整个数组是否为空,只是要检查索引值为“ index”的某个位置»
Oriol

对于想要检查整个数组的用户来说,是一个很好,简短的简单答案
Luis Martins


8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@thomasrutter我很难提出一种可能以未定义的数组元素结尾的方法。
Rex M

嗯,(myarray [1] = undefinedvariable)有效吗?或者只是(myarray [1] =未定义)?
thomasrutter

@thomasrutter这两个都会抛出异常,不是吗?(undefinedvariables undefined)
Rex M

1
您可以使用Firebug之类的工具自己对其进行测试。在Javascript中,读取未定义变量的值不会引发异常-它会返回未定义的值。
thomasrutter

@thomasrutter您的第一条评论是错误的。x == null仅对null或undefined会为true,否则为true。同样,x != null对于任何不为null或未定义的内容,则为true。除非您特别需要寻找未定义的内容,否则请依靠隐式转换的好处。
Marcus Stade

8

简短而通用的方法

如果要检查任何数组是否具有伪造的值(例如false,undefined,null或空字符串),则可以使用every()方法,如下所示:

array.every(function(element) {return !!element;}); // returns true or false

例如:

['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true

如果需要获取虚假值的第一个索引,可以这样做:

let falsyIndex; 

if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
  console.log(falsyIndex);
} // logs 3

如果只需要检查给定索引的数组的伪造值,则可以这样进行:

if (!!array[index]) {
  // array[index] is a correct value
}
else {
  // array[index] is a falsy value
}

6
if(typeof arr ==='object' && arr instanceof Array ){
   if(!arr.length){
      println 'empty'
   }else{
      printn 'not Empty'
   }

}else{
   println 'Null'
}

如果用'Null'表示->其元素为null或等于'',在这种情况下:在过滤所有'null'元素后检查数组是否为空

if(!arr.clean().length){return 'is null'}

当然,请在以下位置添加Clean 方法:

Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

5

我建议创建这样的函数:

function isEmptyEl(array, i) {
   return !(array[i]);
}

您可以这样称呼它:

if (isEmptyEl(arrayName, indexVal)) {
   console.log('arrayName[' + indexVal + '] is empty');
}

强制开发人员遵守isEmptyEl接口将捕获输入错误,例如未定义的arrayName或indexVal变量。

(通常,在使用Javascript进行编程时,最好进行防御性编程。)

如果未定义arrayName,则会引发如下错误:

Uncaught ReferenceError: arrayName is not defined
    at <anonymous>:2:15
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

未定义indexVal的结果相似。

如果数组或索引值不存在,则会出现错误。

对于有效输入,只有在arrayName [indexVal]为以下任意一项时,您才会获得true:

  • 空值
  • 未定义
  • N
  • 空字符串
  • 0

5

这取决于您对“空”的含义。

当您尝试获取不具有该名称的属性的对象的属性值时,您将获得该值 undefined

稀疏数组就是这种情况:并非所有在0和之间的索引都array.length-1存在。

因此,您可以检查是否array[index] === undefined

但是,该属性index可以带有undefined值存在。如果要过滤掉这种情况,可以使用in运算符或hasOwnProperty,如如何检查对象在JavaScript中是否具有属性中所述。

index in array;
array.hasOwnProperty(index);

如果要考虑不存在具有undefinednull值的现有属性,则可以使用松散比较array[index] == undefinedarray[index] == null

如果你知道数组不疏,你可以比较index使用array.length。但是为了安全起见,您可能要确保index确实是数组索引,请参阅检查属性名称是否为数组索引


2
这是在未设置的数组项(没有任何值)和设置为未定义值的项之间正确区分的唯一答案。这两种状态由于访问未设置的数组项返回未定义的事实而变得模糊,但是它们是不同的。
olivr

当您的数组具有可能未设置的值(不同于undefined或null)时,请使用hasOwnProperty。
CMCDragonkai '18年

1

好的,首先让我们看看如果JavaScript中不存在数组值会发生什么,所以如果我们有一个如下所示的数组:

const arr = [1, 2, 3, 4, 5];

现在我们检查索引5处是否有6

arr[5];

我们得到 undefined...

因此,这基本上给了我们答案,这是检查是否未定义的最佳方法,如下所示:

if("undefined" === typeof arrayName[index]) {
  //array value is not there...
}

在这种情况下最好要这样做:

if(!arrayName[index]) {
  //Don't check like this..
}

因为想象一下我们有这个数组:

const arr = [0, 1, 2];

我们做:

if(!arr[0]) {
  //This get passed, because in JavaScript 0 is falsy
}

因此,正如您所看到的,即使那里是0,也不会被识别,还有其他一些事情可以做到这一点,并使您的应用程序出现故障,因此请小心,我将它们全部列出:

  1. undefined:如果该值未定义且为undefined
  2. null:如果为null,例如DOM元素不存在...
  3. 空字符串''
  4. 0:数字零
  5. NaN:不是数字

1

我想指出一些似乎遗漏的东西:即有可能在数组的中间有一个“空”的数组位置。考虑以下:

let arr = [0, 1, 2, 3, 4, 5]

delete arr[3]

console.log(arr)      // [0, 1, 2, empty, 4, 5]

console.log(arr[3])   // undefined

然后检查的自然方法是查看数组成员是否未定义,我不确定是否存在其他方法

if (arr[index] === undefined) {
  // member does not exist
}

0

如果array [index]为null,请尝试

if (array[index] != null) 

0

使用Lodash,您可以执行以下操作:

if(_.has(req,'documents')){
      if (req.documents.length)
      _.forEach(req.documents, function(document){
        records.push(document);
      });
} else {
}

if(_.has(req,'documents'))是检查我们的请求对象是否具有一个名为属性documents,是否具有该属性,接下来if (req.documents.length)是验证它是否不是一个空数组,因此forEach可以进行其他操作。


0

要检查它是否从未定义过或是否已删除:

if(typeof arrayName[index]==="undefined"){
     //the index is not in the array
}

也适用于关联数组和删除了一些索引的数组

要检查它是否从未被定义过,是否被删除,或者是一个空值还是逻辑空值(NaN,空字符串,false):

if(typeof arrayName[index]==="undefined"||arrayName[index]){
     //the index is not defined or the value an empty value
}

0

我使用laravel数据表遇到了这个问题。我properties在活动日志中存储了一个称为JSON的值,并希望根据此值是否为空来显示一个按钮。

好吧,数据表将其解释为数组(如果为空),则解释为对象(如果不是),因此,以下解决方案对我有用:

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

对象没有length属性。


0

我认为此决定适合于喜欢声明式功能编程而不是命令式OOP或程序的人。如果您的问题是内部是否存在某些值?(真值还是假值)”,则可以使用.some方法来验证内部值。

[].some(el => el || !el);
  • 它不是完美的,但不需要应用包含相同逻辑的任何额外功能,例如function isEmpty(arr) { ... }
  • 听起来比“长度为零吗?”更好当我们这样做时,在某些情况下会[].length导致0危险。
  • 甚至[].length > 0“长度大于零?”。

高级示例:

[    ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true

-1

您可以使用Loadsh库更有效地执行此操作,例如:

如果您有一个名为“ pets”的数组,例如:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });

要检查所有数组值是否为空或未定义的值:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

http://underscorejs.org/中查看更多示例


fn(){}是语法错误,目前尚不清楚这如何帮助检查数组项是否存在于特定索引处。
Oriol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.