【问题标题】:String available check in for loop字符串可用签入for循环
【发布时间】:2012-06-27 08:07:19
【问题描述】:

我有这些猫品种

cats = [
'Abyssinian',
'Balinese',
'Bombay',
'Birman'];

现在写的代码一般是这样的

 for(var i in cats)
 {
  ... do
 }

现在我必须在 javascript 中修改相同的函数。我只能修改以查看i 是否为BalineseBombay 中的任何一个......然后执行这些

我在想

 for(var i in cats)
 {
  if(i == 'Balinese' || i == 'Bombay'){
  ... do
  }
 }

相反,我希望 i 包含 Balinese,Bombay 而不是在中间写 | 子句?

 for(var i in cats)
 {
  if(i.contains('Balinese', 'Bombay'){   //this would be better, suggestions?
  ... do
  }
 }

怎么做?

【问题讨论】:

  • 这里有什么cat?还有它的|| 不是|
  • 如果猫的品种在数组或对象字面量中,您还需要提及它们的类型
  • cats{ Abyssinian, Balinese, Bombay, Birman} 不是有效的语法,看到后面的所有内容都建立在此之上,很难猜测您要修复哪个错误。
  • 我不太明白为什么逻辑 OR 运算符对你有那么大的干扰。

标签: javascript string if-statement for-loop


【解决方案1】:

试试这个代码,

这会在不支持的浏览器中添加 .indexOf()

if (!Array.prototype.indexOf) {  
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {  
        "use strict";  
        if (this == null) {  
            throw new TypeError();  
        }  
        var t = Object(this);  
        var len = t.length >>> 0;  
        if (len === 0) {  
            return -1;  
        }  
        var n = 0;  
        if (arguments.length > 0) {  
            n = Number(arguments[1]);  
            if (n != n) { // shortcut for verifying if it's NaN  
                n = 0;  
            } else if (n != 0 && n != Infinity && n != -Infinity) {  
                n = (n > 0 || -1) * Math.floor(Math.abs(n));  
            }  
        }  
        if (n >= len) {  
            return -1;  
        }  
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);  
        for (; k < len; k++) {  
            if (k in t && t[k] === searchElement) {  
                return k;  
            }  
        }  
        return -1;  
    }  
} 

在数组原型中添加 contains 方法

 Array.prototype.contains = function(){ 
       for(var i=0,len=arguments.length;i<len;i++){
          if(this.indexOf(arguments[i]) !== -1){ 
              return true;
          } 
       }
       return false;
    }

现在,你可以这样使用了,

var cats = [
'Abyssinian',
'Balinese',
'Bombay',
'Birman'];

if(cats.contains('Balinese')){
  console.log('Balinese');
}

if(cats.contains('Balinese','Bombay')){
  console.log('Balinese,Bombay');
}

if(cats.contains('lines','Bombay')){
  console.log('lines,Bombay');
}

if(cats.contains('lines','mbay')){
  console.log('lines,mbay');
}

如果你使用 jQuery,这段代码可以更简单:)

【讨论】:

    【解决方案2】:

    检查此代码,

    var cats=['Abyssinian', 'Balinese', 'Bombay', 'Birman'];
    
    Array.prototype.contains=function(incattype){
    
        for(var i=0; i<cats.length;i++){
    
            if(cats[i]==incattype) {
                return true;
            } else{
                 return false;
            }      
        }
    };
    
    
      var catslist=['Abyssinian', 'Balinese', 'Bombay11' ];
    
        for(var i=0; i<catslist.length;i++){
    
            document.write(cats.contains(catslist[i]));
        }        
    

    链接;-

    http://jsfiddle.net/fPdej/2/

    【讨论】:

    • 既然已经有了indexOf-method,为什么还要构建一个 contains 方法?
    【解决方案3】:

    首先,重要的是要意识到,如果您使用for...in 遍历一个javascript 数组,那么您必须使用hasOwnProperty 方法:

    for(var i in cats){
        if(cats.hasOwnProperty(i))
            console.log(cats[i]);        
    }
    

    你真的应该像这样使用for(;;)

    for(var i=0;i<cats.length;i++){
       console.log(cats[i]);
    }
    

    除此之外,您正在寻找Array.indexOf,它受到现代浏览器的支持,但在旧浏览器中的支持可能较少 - 这就是为什么大多数框架(jQuery、Moo、原型等)都定义了自己的这种方法的变体(详情请参阅this question's answers)。

    var cats = ["Abyssinian","Balinese","Bombay","Birman"];
    
    var test = ["Abyssinian","Balinese"];
    
    for(var i in cats){
        if(cats.hasOwnProperty(i) && test.indexOf(cats[i]) != -1)
            console.log(cats[i]);        
    }
    

    现场示例:http://jsfiddle.net/4xJsg/

    【讨论】:

      【解决方案4】:

      不建议使用 for-in 循环,因为它们比 for、while 或 do-while 循环慢七倍。除了 for-in,您也可以使用 for-each,它不如 for 或 while 快,但更类似于 for-in 循环。

      结合正则表达式,我的做法是:

      var cats = [
          'Abyssinian',
          'Balinese',
          'Bombay',
          'Birman'
      ];
      
      cats.forEach(function(cat, index){
          if(cat.match(/Abyssinian|Birman/)){
          // Do what you want
          }
      });
      

      【讨论】:

        【解决方案5】:

        试试嵌套循环?

        var cats = ["Abyssinian", "Balinese", "Bombay", "Birman"];
        var thisAndThat = ["Abyssinian", "Apple", "Siberian", "Windows", "StackOverflow"];
        
        for(var i in cats) {
            for(var x in thisAndThat) {
                if(cats[i] == thisAndThat[x]){
                    ... do
                }
            }
        }
        

        使用 jQuery

        $.each(thisAndThat, function(key, value){
          if( $.inArray(value, cats) > -1 ){
            alert(value+" is inside the cats array.");
          }
        });
        

        【讨论】:

        • 您的数组初始化错误。不是var cats[] = [a,b,c];,而是var cats = [a,b,c];
        • 天哪,这不是我学习 JavaScript 语法的日子。感谢您接听!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多