【问题标题】: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 数组。使用上述代码,我仍然无法检测到不存在的索引。

【问题讨论】:

  • 你的逻辑错了。您需要在各个条件之间使用连词 (&&)。

标签: javascript titanium titanium-mobile


【解决方案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)
  • 如果项目存在,但它的值未定义,则此操作失败;改用这个答案-> stackoverflow.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 以下是正确的:

      1. 数组实际上只是 JS 引擎盖下的对象
      2. 因此,他们有原型方法hasOwnProperty“继承”自Object
      3. 在我的测试中,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

      【讨论】:

      【解决方案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

                【讨论】:

                  猜你喜欢
                  • 2013-03-21
                  • 1970-01-01
                  • 2017-11-19
                  • 2020-05-26
                  • 2010-09-20
                  • 2012-03-10
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-09
                  相关资源
                  最近更新 更多