【问题标题】:javascript includes() case insensitivejavascript include() 不区分大小写
【发布时间】:2018-06-17 03:28:31
【问题描述】:

我有一个字符串数组,我需要循环并检查另一个传入的字符串。

var filterstrings = ['firststring','secondstring','thridstring'];
var passedinstring = localStorage.getItem("passedinstring");

for (i = 0; i < filterstrings.lines.length; i++) {
    if (passedinstring.includes(filterstrings[i])) {
        alert("string detected");
    }
}

如果var passedinstring 包含FirsTsTriNgfiRSTStrING 之类的字符串,我如何确保在过滤时忽略大小写(最好使用正则表达式)?

【问题讨论】:

  • 使用常见的情况或创建一个正则表达式并使用类似.some的东西
  • 这不应被标记为重复。使用includes 而不是正则表达式的优势在于它涵盖了字符串包含正则表达式特殊字符的情况。

标签: javascript regex


【解决方案1】:
var filterstrings = ['firststring','secondstring','thridstring'];
var passedinstring = localStorage.getItem("passedinstring");

filterstrings.filter(item => item.name.toLowerCase().includes(passedinstring.toLowerCase()))

【讨论】:

  • 您的解决方案与此非常相似:stackoverflow.com/a/63030383/3216427 只是将(str) =&gt; str.toLowerCase()... 替换为item =&gt; item.name.toLowerCase()...。您能否解释一下这种差异有何变化以及为什么您认为这是一种改进的解决方案?
【解决方案2】:

你可以试试这个。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
string = fruits.join(' ').toUpperCase();
// Output"BANANA ORANGE APPLE MANGO"

【讨论】:

    【解决方案3】:

    您可以使用返回布尔值.some 方法切换.includes
    它会在找到匹配项后立即退出,这对于大型数组的性能非常有用:

    .some(item => item.toLowerCase() == lookup.toLowerCase())
    

    演示:

    var arr = ['foo','bar','bar'];
    var lookup = "bAr";
    
    // case-sensetive
    console.log( arr.includes(lookup) )
    
    // case-insensetive without caring about the type
    console.log( arr.some(x => x.toLowerCase() == lookup.toLowerCase()) ) 

    或者用一个唯一的名字定义你自己的Array原型方法:

    // the name ("_includes") should be unique enough not to ever be overriten 
    // by future language updates or 3rd-party scripts
    Array.prototype._includes = function(target){ 
      return this.some(x => x.toLowerCase() == (target||'').toLowerCase()) 
    }
    
    console.log( 
      ['foo', 'bar', 'bar']._includes("bAr") 
    )

    【讨论】:

      【解决方案4】:

      您可以先从filterstrings 创建一个RegExp

      var filterstrings = ['firststring','secondstring','thridstring'];
      var regex = new RegExp( filterstrings.join( "|" ), "i");
      

      如果有passedinstring,那么test

      var isAvailable = regex.test( passedinstring ); 
      

      【讨论】:

      • 请注意 firststringtest 在这里也将返回 true。对于 ES5,filterstrings.map((a) =&gt; { return a.toLowerCase() }).includes(passedinstring.toLowerCase()) 可能是解决这个问题的方法。
      • filterstrings 必须转义,否则您可能会导致正则表达式损坏或出现意外行为。
      • 这比 .includes() 慢多少?
      • 这不应该是一个可以接受的答案!寻求答案并偶然发现此答案的人-当心!这将返回true,因为可以在数组中找到任何子序列。 [1,2,3].includes(12) // false new RegExp([1,2,3].join("|"), "i").test(12) // true!!! ["Hello","World"].includes("HelloWorld") // false \n new RegExp(["Hello", "World"].join("|"), "i").test("HelloWorld") // true!!!
      • 将随机字符串映射到正则表达式模式不是一个好主意,除非您真的知道这些字符串不会包含特殊字符。
      【解决方案5】:

      我相信这会更简单、更短、更容易理解。

        const q = new RegExp(query, 'i');
      
        filteredUsers = users.filter((user: User) => {
          return (
            user.entity.short.match(q) ||
            user.firstname.match(q) ||
            user.lastname.match(q)
          );
        });
      

      【讨论】:

      • 这似乎是在过滤一组不同的数据……并假设query 不会在正则表达式中包含任何具有特殊含义的字符。
      【解决方案6】:

      ES6数组方法filter()可以简单的单行解,使用includes()方法判断数组中是否包含某个值,结合toLowerCase()方法将其转为小写。

      p>
      var filterstrings = ['firststring','secondstring','thridstring'];
      var passedinstring = localStorage.getItem("passedinstring");
      
      // convert each string from filterstrings and passedinstring to lowercase
      // to avoid case sensitive issue.
      filteredStrings = filterstrings.filter((str) => str.toLowerCase().includes(passedinstring.toLowerCase())
      

      【讨论】:

      • 这是一个很好的答案!这是一个非常简单的单行解决方案。我在过滤器中使用filteredStrings 行,我只是检查封装过滤器语句中的长度是否> 0
      • 谢谢 - 当人们用最新的功能回答老问题时,我们总是感激不尽!
      • 使用localeCompare() 会更安全。普通的 .toLowerCase() 可能会出现问题 - 请参阅 Jon Skeet 在 YouTube Back to basics: the mess we've made of our fundamental data types 上的演示以了解更多信息。
      • 我使用了一个变体:filteredstrings = filterstrings.some(e => e.toUpperCase().includes(activeSearch.toUpperCase()))
      【解决方案7】:

      使用toLowerCase() 修复了区分大小写的问题。比较时会将所有string 转换为小写。

      var product=productList.filter((x) => x.Name.toLowerCase().includes(("Active").toLowerCase()))
      

      【讨论】:

        【解决方案8】:

        我的选择是将 UPPER 与 UPPER 进行比较,或者将 UPPER 与 UPPER 进行比较,或者将两者与较低的进行比较(我经常在 SQL 中这样做):

            var filterstrings = ['firststring','secondstring','thirDstrIng'];
            var passedinstring =  'ThIrDsTrInG3';
            
            //used for of just to make it more readable
            for (filterstring of filterstrings) {
                if (passedinstring.toUpperCase().includes(filterstring.toUpperCase())) {
                    alert("string detected");
                }
            
            }
        
        

        提示string detected

        【讨论】:

          【解决方案9】:

          将filterstring和passedinstring转换为小写并比较

          var filterstrings = ['firststring','secondstring','thridstring'];
          var passedinstring = 
          localStorage.getItem("passedinstring").toLowerCase();
          
          for (i = 0; i < filterstrings.lines.length; i++) {
             if (passedinstring.includes(filterstrings[i].toLowerCase())) {
                 alert("string detected");
             }
          }
          

          【讨论】:

            【解决方案10】:

            您可以简单地将传递的字符串转换为小写。

            var passedinstring = localStorage.getItem("passedinstring").toLowerCase();
            

            【讨论】:

            • 好吧,它在给定的情况下工作,但我想我们希望它也能以相反的方式工作......(即过滤后的字符串也有大写字母)
            • 如果您希望其他方式也能正常工作,只需在输入的字符串上使用 toLowerCase() 即可。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-03
            • 2012-12-01
            • 2013-03-06
            • 2020-02-18
            相关资源
            最近更新 更多