如何在javascript中检查数组索引是不是存在?

Posted

技术标签:

【中文标题】如何在javascript中检查数组索引是不是存在?【英文标题】:How to check if an array index exists or not in javascript?如何在javascript中检查数组索引是否存在? 【发布时间】:2012-10-17 22:54:28 【问题描述】:

我正在使用 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】:

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

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

else 
    // does exist

【讨论】:

+1,很好。您也可以使用if(arrayName[index] === 'undefined') 作为快捷方式 @AnchovyLegend 不,你不能!但是你可以使用if(arrayName[index] === undefined) 如果项目存在,但它的值未定义,则此操作失败;改用这个答案-> ***.com/questions/1098040/… 正如@Matus 所说,here 有更多解释,您应该注意。 for if(arrayName[index] === undefined) 你可以使用更短的 if(!arrayName[index])【参考方案2】:

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

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

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

【讨论】:

如果变量 arrayName 本身(或 index)不存在,这应该只有“损坏”并出现错误。简单地访问未定义的数组元素不应该导致“错误”吗?【参考方案3】:
var myArray = ["Banana", "Orange", "Apple", "Mango"];

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

else 
  console.log("element found");

【讨论】:

很遗憾,这个在 IE 7 及以下版本中不起作用。 在我看来这是最好的答案,现在 IE 7 不再维护,所以这不是问题。虽然我会建议使用三等号if(myArray.indexOf(searchTerm) === -1) OP 正在查看给定的 index 编号是否存在。这是检查给定的 value 是否存在。【参考方案4】:

如果您使用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'); 【参考方案5】:

如果数组的元素也是简单的对象或数组,可以使用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 是这里最现代的方式。它甚至还可以变成像myArray.some(el => el.item === element.item && el.title === element.title)这样的单行符【参考方案6】:

你可以简单地使用这个:

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

【讨论】:

错误。如果tmp = [0,0,0,0] 那么 tmp[3] 应该存在怎么办【参考方案7】:

考虑数组a:

var a ='name1':1, 'name2':2

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

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

【讨论】:

"var a" 在您的情况下不是数组对象,而是常规对象。应该是 var a = [ ... ]。我认为这是作者需要的。 这是如何检查对象中是否存在键,而不是数组中是否存在索引。 in 运算符似乎也适用于数组。就像2 in [5, 6, 7, 8, 9, 10] 是真的,但6 in [5, 6, 7, 8, 9, 10] 是假的。只需将您对数组的答案更改为相关即可。【参考方案8】:

我认为这种方式是最简单的。

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');
        
 

【讨论】:

【参考方案9】:

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

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")

【讨论】:

效率极低。如果我设置myArray[1000000] = 'Pear' 那么你的函数将永远持续下去。【参考方案10】:
(typeof files[1] === undefined)?
            this.props.upload(file: files):
            this.props.postMultipleUpload(file: files widgetIndex: 0, id)

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

【讨论】:

【参考方案11】:
var demoArray = ['A','B','C','D'];
var ArrayIndexValue = 2;
if(ArrayIndexValue in demoArray)
   //Array index exists
else
   //Array Index does not Exists

【讨论】:

你在期待什么..实际上是什么问题?【参考方案12】:

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

下面是sn-pr

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 因为这不是这个问题的目的。在Array.includes 之前,我们早就有能力检查一个值是否是一个数组,比如demoArray.indexOf(ArrayIndexValue) !== -1。这个问题是关于检查数组中是否存在索引,这是一个完全不同的问题【参考方案13】:

如果我错了,请有人纠正我,但 AFAIK 以下是正确的:

    数组实际上只是 JS 引擎盖下的对象 因此,他们有原型方法hasOwnProperty“继承”自Object 在我的测试中,hasOwnProperty 可以检查数组索引处是否存在任何内容。

所以,只要上述情况属实,你就可以简单地:

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

用法:

arrayHasIndex([1,2,3,4],4); 输出:false

arrayHasIndex([1,2,3,4],2); 输出:true

【讨论】:

这也适用于数组中的未定义和空值,这里没有其他答案。 从 MDN 验证:“如果 Object 是 Array,hasOwnProperty 方法可以检查索引是否存在。” developer.mozilla.org/en-US/docs/Web/javascript/Reference/…【参考方案14】:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
if(fruits.indexOf("Banana") == -1)
    console.log('item not exist')
 else 
	console.log('item exist')

【讨论】:

【参考方案15】:

当试图找出 JS 中是否存在数组索引时,最简单快捷的方法是通过双重否定。

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

【讨论】:

a[1] = false 呢? 0? ''?【参考方案16】:

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

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

accepted answer 是错误的,如果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!

【讨论】:

【参考方案17】:
const arr = []

typeof arr[0] // "undefined"

arr[0] // undefined

如果布尔表达式

typeof arr[0] !== typeof undefined

为真则 arr 中包含 0

【讨论】:

【参考方案18】:

这也可以正常工作,使用===undefined 进行类型测试。

if (array[index] === undefined) return  // True

测试:

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

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

【讨论】:

【参考方案19】:

这些天我会利用 ecmascript 并像那样使用它

return myArr?.[index]

【讨论】:

@dsi 您可以随时在控制台中查看它。无论如何它应该。想法正是为了避免您在这种情况下出错。【参考方案20】:
if(typeof arrayName[index] == undefined) 
    console.log("Doesn't exist")

else 
console.log("does exist")

【讨论】:

【参考方案21】:

单行验证。最简单的方法。

return !!currentData[index];

输出

var testArray = ["a","b","c"]

testArray[5]; //output => undefined
testArray[1]; //output => "b"

!!testArray[5]; //output => false
!!testArray[1]; //output => true

【讨论】:

当然没关系,但是,当一切都变得高度嵌套(难以阅读)时,您展示的方式为读者增加了额外的复杂性。即使是经验丰富的 js 编码人员,一口气读懂逻辑也很困难。 testArray = [0, 0, 0] 将为每个索引生成false,即使它们已给出。【参考方案22】:

使用 Object.hasOwn()

数组的元素被认为是自己的属性,因此您可以使用新的Object.hasOwn() 方法以简短而优雅的方式检查特定索引是否存在,如下例所示:

let cars = ['Reno', 'Ford','Honda', 'BMW'];
console.log(Object.hasOwn(cars, 3));   // true ('BMW')
console.log(Object.hasOwn(cars, 4));   // false - not defined

【讨论】:

以上是关于如何在javascript中检查数组索引是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

检查javascript数组中的数字索引[关闭]

如何在 Swift 中检查我的数组索引是不是超出范围

如何检查 Javascript 中是不是存在字符串/数组/对象? [复制]

PHP - 检查数组索引是不是存在或为空

如何检查字符串是不是包含 JavaScript 预定义数组中存在的子字符串?

如何根据 JavaScript 中的值检查对象是不是在数组中?