如何检查JavaScript中是否存在数组元素?


196

我正在使用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。我仍然无法使用上述代码检测到不存在的元素。


1
你的逻辑是错误的。您需要&&各个条件之间的连词()。
JK 2012年

Answers:


376

typeof arrayName[index] === 'undefined'

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

4
+1,很好。您也可以将其if(arrayName[index] === 'undefined')用作快捷方式
AnchovyLegend 2013年

65
@AnchovyLegend不,你不能!但是你可以使用if(arrayName[index] === undefined)
Denis V

18
如果该项目在那里,则失败,但其值未定义;使用这个答案,而不是- > stackoverflow.com/questions/1098040/...
马特斯

作为@Matus说,有更多的解释在这里,你应该知道的。
S.Thiongane 2014年

1
对于if(arrayName [index] ===未定义),您甚至可以使用更短的if(!arrayName [index])
Park JongBum

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

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

2
不幸的是,此版本在IE 7及更低版本中不起作用。
darksoulsong 2014年

4
我认为这是最好的答案,到目前为止,不再维护IE 7,所以这不是问题。尽管我建议使用三重等于if(myArray.indexOf(searchTerm) === -1)
Mauro Gava'9

2
OP正在查看给定索引号是否存在。这是在检查给定值是否存在。
jonathan.s

6

如果我错了,请有人指正我,但AFAIK确实是这样:

  1. 数组实际上只是JS的对象
  2. 因此,他们具有hasOwnProperty从“继承” 的原型方法Object
  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


这也适用于数组中的未定义和null值,这里没有其他答案。
杰克·塔库尔

通过MDN验证:“如果对象是数组,则hasOwnProperty方法可以检查索引是否存在。” developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…–
Loren

3

我必须将techfoobar的答案包装在try.. catch块中,如下所示:

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

...无论如何,这就是在chrome中的工作方式(否则,代码因错误而停止)。


如果变量arrayName本身(或index)不存在,则应该仅在“中断”时出现错误。简单地访问未定义的数组元素应该不会导致“错误”?
怀特先生

3

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

// 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是这里最现代的方式。它甚至还可以变成myArray.some(el => el.item === element.item && el.title === element.title)
单线格式

2

考虑数组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')

5
在您的情况下,“ var a”不是数组对象,而是常规对象。应该是var a = [...]。我认为这是作者需要的。
托马沙林

3
这是检查对象中是否存在键的方法,而不是数组中是否存在索引的方法。
本·赫尔


1

如果您使用 underscore.js,则库将隐藏这些类型的null和未定义检查。

因此您的代码将如下所示-

var currentData = new Array();

if (_.isEmpty(currentData)) return false;

Ti.API.info("is exists  " + currentData[index]);

return true;

现在,它看起来更具可读性。


即使您的答案是正确的,我对此也会三思而后行。您的代码将仅依赖于检查空值而成为underscore.js依赖。只需做一个简单的包装函数isset(v){return(typeof v!=='undefined'); }
Heroselohim 2014年

1

检查项目是否存在的简单方法

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--)
       if (this[i] == obj)
       return true;
    return false;
}

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

myArray.contains("Apple")

3
效率极低。如果我设置了该myArray[1000000] = 'Pear'功能,您的功能将永远存在。
约翰·亨克尔

1

我认为这种方式最简单。

var nameList = new Array('item1','item2','item3','item4');

// Using for loop to loop through each item to check if item exist.

for (var i = 0; i < nameList.length; i++) {
if (nameList[i] === 'item1') 
{   
   alert('Value exist');
}else{
   alert('Value doesn\'t exist');
}

也许另一种方法是。

nameList.forEach(function(ItemList)
 {
   if(ItemList.name == 'item1')
        {
          alert('Item Exist');
        }
 }


1

如果您正在寻找这样的东西。

这是以下片段

var demoArray = ['A','B','C','D'];
var ArrayIndexValue = 2;
if(demoArray.includes(ArrayIndexValue)){
alert("value exists");
   //Array index exists
}else{
alert("does not exist");
   //Array Index does not Exists
}


这是我今天将在我的项目中使用的解决方案。我不知道为什么会有下降投票-这对于我的用例(服务器端node.js / express)最有效。谢谢
mkrufky

@mkrufky,因为这不是此问题的目的。我们早就Array.includes可以检查值是否为数组,例如demoArray.indexOf(ArrayIndexValue) !== -1。这个问题是关于检查索引是否存在于数组中,这是一个完全不同的问题
r3wt '19

0

您可以简单地使用:

var tmp = ['a', 'b'];
index = 3 ;
if( tmp[index]){
    console.log(tmp[index] + '\n');
}else{
    console.log(' does not exist');
}

3
错误。如果tmp = [0,0,0,0]tmp [3]应该存在,该怎么办
John Henckel

0
(typeof files[1] === undefined)?
            this.props.upload({file: files}):
            this.props.postMultipleUpload({file: files widgetIndex: 0, id})

使用typeof和检查数组中的第二项是否未定义,并检查undefined


0

当试图确定JS中是否存在数组索引时,最简单,最短的方法是通过双重求反。

let a = [];
a[1] = 'foo';
console.log(!!a[0])   // false
console.log(!!a[1])   // true

0

这正是in运营商的目的。像这样使用它:

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

接受的答案是错误的,它会给出假阴性如果在值indexundefined

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!
}


0
const arr = []

typeof arr[0] // "undefined"

arr[0] // undefined

如果是布尔表达式

typeof arr[0] !== typeof undefined

为true,则arr中包含0


0

按type进行测试也可以正常工作undefined

if (currentData[index] === undefined){return}

测试:

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

if (fruits["Raspberry"] === undefined){
  console.log("No Raspberry entry in fruits!")
}

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.