如何在JavaScript中检查数组索引是否存在?

286

我正在使用Titanium开发,我的代码看起来像这样:

var currentData = new Array();
if(currentData[index]!==""||currentData[index]!==null||currentData[index]!=='null')
{
    Ti.API.info("is exists  " + currentData[index]);
    return true;
}
else
{   
    return false;
}

我正在向currentData数组传递一个索引。使用上述代码,我仍然无法检测到不存在的索引。


2
你的逻辑是错误的。在每个条件之间,你需要使用连接词(&&)。 - J. K.
尝试这些检查 - https://dev59.com/l1TTa4cB1Zd3GeqPu7nL#71808205 - Manohar Reddy Poreddy
20个回答

519

使用typeof arrayName[index] === 'undefined'

if(typeof arrayName[index] === 'undefined') {
    // does not exist
}
else {
    // does exist
}

6
+1,很好。你还可以使用if(arrayName[index] === 'undefined')作为一种快捷方式。 - AnchovyLegend
97
@AnchovyLegend,不可以这样做!但是你可以使用if(arrayName[index] === undefined) - Denis V
35
如果数组项存在但其值未定义,这种方法会失败;请使用以下答案 -> https://dev59.com/ZnNA5IYBdhLWcg3wF5qO - Matus
2
如果你想要判断一个数组中的某个元素是否为undefined,你可以使用更简短的方式,即if(!arrayName[index])。 - Park JongBum
@ParkJongBum 只有当他们理解 JavaScript 中的“falsy”并且数组不包含任何 falsy 值时,才能起作用。例如,如果 a[0] 存在且为空字符串(或 0 或 null 或其他 falsy 值),!a[0] 将返回 true(表示元素不存在)而不是 false: a = ['']; if (a[0] === undefined) { console.log('not-exist') } else { console.log('exists') } ; if (!a[0]) { console.log('not-exist') } else { console.log('exists') } - jonathan.s
显示剩余2条评论

91
var myArray = ["Banana", "Orange", "Apple", "Mango"];

if (myArray.indexOf(searchTerm) === -1) {
  console.log("element doesn't exist");
}
else {
  console.log("element found");
}

3
很抱歉,这个在IE 7及以下版本中无法正常运行。 - darksoulsong
6
在我看来,这是最好的答案。目前IE 7已经不再被维护,所以这不是一个问题。尽管如此,我建议使用三个等号 if(myArray.indexOf(searchTerm) === -1) - Mauro Gava
11
OP 想要查看给定的 索引 数字是否存在。这是在检查给定的 是否存在。 - jonathan.s

53

现在我会利用ECMAScript,像这样使用它。

return myArr?.[index]

@dsi,您随时可以在控制台中检查它。无论如何,这是确保您不会出错的想法。 - Saulius
让日期 = 字符串匹配(/Date: (.*)/)?.[1] > SyntaxError: 意外的令牌 '.' - assayag.org
1
哇,这太棒了!测试了所有情况,运行得非常好。 - Viet Nguyen

31
这正是使用in运算符的用途。像这样使用它:

{{使用in运算符来判断}}

if (index in currentData) 
{ 
    Ti.API.info(index + " exists: " + currentData[index]);
}

被接受的答案是错误的,如果index处的值为undefined,它会给出一个错误的负值:

const currentData = ['a', undefined], index = 1;

if (index in currentData) {
  console.info('exists');
}
// ...vs...
if (typeof currentData[index] !== 'undefined') {
  console.info('exists');
} else {
  console.info('does not exist'); // incorrect!
}


只适用于数字索引,因为它会搜索对象上的属性是否存在。例如,让颜色等于新数组(“绿色”,“蓝色”,“黄色”);“黄色”在颜色中 >> false - undefined
@PolRué 这是有意为之的,in 运算符用于检查索引是否存在(是否有关联的值,而不是一个空洞)。如果你想检查元素的成员资格,我建议使用 Set 类型和它的 .has 方法。 - undefined
1
是的,我也得出了同样的结论。在我的情况下,.效果很好。 - undefined

20

如果我说错了,请有人纠正我,但根据我所知,以下内容是正确的:

  1. 在JS内部,数组实际上只是对象
  2. 因此,它们继承了Object原型方法hasOwnProperty
  3. 在我的测试中,hasOwnProperty可以检查数组索引处是否存在任何元素。

因此,只要上述内容是真实的,你就可以简单地:

const arrayHasIndex = (array, index) => Array.isArray(array) && array.hasOwnProperty(index);

用法:

arrayHasIndex([1,2,3,4],4); 的输出结果为:false

arrayHasIndex([1,2,3,4],2); 的输出结果为:true


4
这也适用于数组中的未定义值和空值,而其他答案都没有做到这一点。 - Jake Thakur
3
从MDN验证:如果一个对象是数组,hasOwnProperty方法可以检查是否存在索引。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty - Loren
2
另外,hasOwnProperty 不会对像 __proto__ 这样的继承属性返回 true,这应该是答案。 - DaCurse
1
这也适用于包含零和其他虚假值的数组 +1。 - undefined

6
这也很好用,使用 === 来测试类型,针对 undefined
if (array[index] === undefined){ return } // True

测试:

const fruits = ["Banana", "Orange", "Apple", "Mango"];

if (fruits["Cherry"] === undefined){
  console.log("There isn't any cherry in the fruits basket :(")
}

同样地,或者说:

const fruits = ["Banana", "Orange", "Apple", "Mango"];

if (!fruits["Cherry"]){
  console.log("There isn't any cherry in the fruits basket :(")
}

// No errors: 
if (fruits["Cherry"]){
  console.log("There is some cherry in there!")
}


1
对于那些不期望 undefined 是数组中有效元素的情况,我会更喜欢使用这个版本,因为这是最有效率的方式。只有当 undefined 是数组中有效元素且你真的需要检查该下标处是否存在任何东西(以避免在该下标处设置无用的项目)时,才请参考我的回答。如果你不是在进行嵌入式开发,其中时钟周期比其他一切都重要,那么这个方法可能并不适用于你。 - r3wt

4

我不得不将techfoobar的答案放入try..catch块中,像这样:

try {
  if(typeof arrayName[index] == 'undefined') {
    // does not exist
  }
  else {
  // does exist
  }
} 
catch (error){ /* ignore */ }

无论如何,在chrome中都是这样工作的(否则,代码将停止并出现错误)。


2
如果变量arrayName本身(或index)不存在,那么这应该只会出现一个带有错误的“broken”。仅仅访问未定义的数组元素不应该导致“error”? - MrWhite

3

如果数组的元素也是简单对象或数组,可以使用 some 函数:

// search object
var element = { item:'book', title:'javasrcipt'};

[{ item:'handbook', title:'c++'}, { item:'book', title:'javasrcipt'}].some(function(el){
    if( el.item === element.item && el.title === element.title ){
        return true; 
     } 
});

[['handbook', 'c++'], ['book', 'javasrcipt']].some(function(el){
    if(el[0] == element.item && el[1] == element.title){
        return true;
    }
});

some is the modernest way around here. It also can even become a one-liner like myArray.some(el => el.item === element.item && el.title === element.title) - vahdet

3
考虑数组a:
var a ={'name1':1, 'name2':2}

如果你想要检查'a'中是否存在'name1',只需使用in进行测试:

if('name1' in a){
console.log('name1 exists in a')
}else
console.log('name1 is not in a')

6
在你的情况下,"var a" 不是一个数组对象,而是一个普通对象。应该写成 var a = [ ... ]。我认为这就是作者需要的。 - tomazahlin
4
以下是如何检查对象中键的存在性,而不是数组中索引的存在性。 - Ben Hull
1
“in” 运算符似乎也适用于数组。例如,“2 in [5, 6, 7, 8, 9, 10]” 是真的,但是 “6 in [5, 6, 7, 8, 9, 10]” 是假的。只需将您的答案更改为数组即可相关。 - Crouching Kitten

3
var demoArray = ['A','B','C','D'];
var ArrayIndexValue = 2;
if(ArrayIndexValue in demoArray){
   //Array index exists
}else{
   //Array Index does not Exists
}

你期望什么..实际上问题是什么? - Geeky

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