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

22

我正在尝试通过以下方式(仅作为示例)检查TypeScript中是否存在数组索引:

var someArray = [];

// Fill the array with data

if ("index" in someArray) {
   // Do something
}

然而,我遇到了以下编译错误:

in运算符要求左操作数为Any类型或String原始类型,右操作数为Any类型或对象类型

有人知道为什么吗?据我所知,我尝试的操作是JS完全合法的。

谢谢。


2
你应该使用对象,而不是数组。 - SLaks
“index”是一个字符串还是实际的数字索引? - elclanrs
我想我会按照SLaks所说的去做,我以为TypeScript数组也可以用作关联数组。 - gipouf
4个回答

33
正如评论所指出的,您混淆了数组和对象。数组可以通过数字索引访问,而对象可以通过字符串键访问。例如:
var someObject = {"someKey":"Some value in object"};

if ("someKey" in someObject) {
    //do stuff with someObject["someKey"]
}

var someArray = ["Some entry in array"];

if (someArray.indexOf("Some entry in array") > -1) {
    //do stuff with array
}

1
在编程中,是否有一个与“in”操作符相反的操作符? - Devid
1
逻辑的,如果(!(“someKey”在someObject中)) - AgBorkowski

11

jsFiddle演示

像这样使用hasOwnProperty:

var a = [];
if( a.hasOwnProperty("index") ){
 /* do something */  
}

也许更好的方法是使用 hasOwnProperty,如 Object.prototype.hasOwnProperty.call(a, 'index')。这里有一个简洁的解释 链接 - Rodrigo García
没错,hasOwnProperty确实有被滥用的可能。如果你正在制作某种大型可移植库,那么覆盖所有情况可能是有意义的。但一般情况下,这个函数完全可以正常工作。 - Travis J

2

一行代码验证。最简单的方法。

if(!!currentData[index]){
  // do something
}

输出

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

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

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

这里的“!!”是多余的。同时,考虑数组“[0, 1, 2]”和“[false, false]”。 - Unmitigated

1
您可以使用findIndex方法:
var someArray = [];

if( someArray.findIndex(x => x === "index") >= 0) {
    // foud someArray element equals to "index"
}

1
这里的x指的是数组中的整个对象。那么这有什么用呢? - Prasad Shinde

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