【问题标题】:How to search for a string inside an array of strings如何在字符串数组中搜索字符串
【发布时间】:2011-07-22 10:08:17
【问题描述】:

在其他帖子中寻找答案后,我觉得我必须问这个。 我看了How do I check if an array includes an object in JavaScript?Best way to find if an item is in a JavaScript array? 无法让那里的代码正常工作。

我正在将一个 html 嵌入代码捕获到一个数组中,因此每个项目都是一行 html 代码。

例如:

i[0]='<param name=\"bgcolor\" value=\"#FFFFFF\" />'
i[1]='<param name=\"width" value=\"640\" />'
i[2]='<param name=\"height\" value=\"360\" />'   
i[3]='more html code' 

我想搜索这个数组并找到单词'height'所在的行。

理想情况下,我想编写一个函数,返回出现“高度”的项目的索引。

幸运的是,这个数组中没有重复项,所以只有一次出现。

通过简单的对象搜索,我得到“假”返回。

有什么想法吗?

【问题讨论】:

    标签: javascript arrays search


    【解决方案1】:

    扩展您链接到的 contains 函数:

    containsRegex(a, regex){
      for(var i = 0; i < a.length; i++) {
        if(a[i].search(regex) > -1){
          return i;
        }
      }
      return -1;
    }
    

    然后你用一个字符串数组和一个正则表达式调用函数,在你的情况下寻找高度:

    containsRegex([ '<param name=\"bgcolor\" value=\"#FFFFFF\" />', 'sdafkdf' ], /height/)
    

    您还可以返回找到高度的索引:

    containsRegex(a, regex){
      for(var i = 0; i < a.length; i++) {
        int pos = a[i].search(regex);
        if(pos > -1){
          return [i, pos];
        }
      }
      return null;
    }
    

    【讨论】:

    • 不错,同样的想法,但更通用。
    【解决方案2】:

    就像迭代数组并寻找正则表达式一样简单

    function searchStringInArray (str, strArray) {
        for (var j=0; j<strArray.length; j++) {
            if (strArray[j].match(str)) return j;
        }
        return -1;
    }
    

    编辑 - 将str 作为函数的参数。

    【讨论】:

    • 非常感谢。似乎我的 JS 代码不起作用。 here 我正在尝试使用此搜索功能,以便将新文本附加到与搜索对应的数组元素之后。用于数组的 html 代码是 here。单击按钮时没有任何反应,问题出在 var 't' 上。如果您评论第 19,20 行,至少该按钮将输出代码。但是由于某种原因,当您尝试调用搜索功能时它不起作用。再次感谢。
    • if 语句中有错字(缺少括号)。我会尽快修复它。顺便说一句,如果您使用 firefox 进行开发,请确保安装 firebug。或者在 Chrome 中使用“检查元素”。这就是我快速找到错误的方式。 Firebug 控制台:missing ( before condition [Break On This Error] if stringArray[j].match ("height") return j;
    • 好的,谢谢。实际上我已经安装了萤火虫,但我不知何故忘记启用它。期待修复并再次感谢。
    • 这应该被称为“searchStringArray”,因为搜索可以用一个正则表达式来执行,而不仅仅是一个字符串
    • 因为在这个线程的大部分发生时,array.indexOf() 和 array.find() 并不存在。
    【解决方案3】:

    avoid using regular expressions 更快,如果您只是想在字符串值数组中查找第一个子字符串匹配项。您可以添加自己的数组搜索功能:

    代码

    Array.prototype.findFirstSubstring = function(s) {
                for(var i = 0; i < this.length;i++)
                {
                    if(this[i].indexOf(s) !== -1)
                        return i;
                }
                return -1;
            };
    

    用法

    i.findFirstSubstring('height');
    

    返回

    -1 如果未找到或第一个子字符串出现的数组索引如果找到(在您的情况下为2

    【讨论】:

      【解决方案4】:

      您可以在 javascript 中使用 Array.prototype.find 函数。 Array find MDN.

      所以要在字符串数组中查找字符串,代码变得非常简单。加上作为浏览器实现,它将提供良好的性能。

      例如

      var strs = ['abc', 'def', 'ghi', 'jkl', 'mno'];
      var value = 'abc';
      strs.find(
          function(str) {
              return str == value;
          }
      );
      

      或者使用 lambda 表达式会变得更短

      var strs = ['abc', 'def', 'ghi', 'jkl', 'mno'];
      var value = 'abc';
      strs.find((str) => str === value);
      

      【讨论】:

        【解决方案5】:

        如果有人想要一些动态搜索。

         let searchInArray=(searchQuery, array, objectKey=null)=>{
        
          return array.filter(d=>{
              let data =objectKey? d[objectKey] : d //Incase If It's Array Of Objects.
               let dataWords= typeof data=="string" && data?.split(" ")?.map(b=>b&&b.toLowerCase().trim()).filter(b=>b)
              let searchWords = typeof searchQuery=="string"&&searchQuery?.split(" ").map(b=>b&&b.toLowerCase().trim()).filter(b=>b)
        
             let matchingWords = searchWords.filter(word=>dataWords.includes(word))
        
            return matchingWords.length
        
        })
            
            
        }
        

        对于字符串数组:

        let arrayOfStr = [
          "Search for words",
          "inside an array",
          "dynamic searching",
          "match rate 90%"
        ]
        
        searchInArray("dynamic search", arrayOfStr)
        
        //Results: [ "Search for words", "dynamic searching" ]
        
        

        对于对象数组:

        let arrayOfObject = [
          {
            "address": "Karachi Pakistan"
          },
          {
            "address": "UK London"
          },
          {
            "address": "Pakistan Lahore"
          }
        ]
        
        searchInArray("Pakistan", arrayOfObject,"address")
        
        //Results: [ { "address": "Karachi Pakistan" }, { "address": "Pakistan Lahore" } ]
        

        【讨论】:

          【解决方案6】:

          var newArr= [];
          function searchStringInArray (str, strArray) {
                 newArr = [];
              strArray.map(item => {
                  str.includes(item) ? newArr.push(item) : '';
              });
            return newArr;
          }
          
          var result = searchStringInArray('Definitely",he said in a matter-of-fact tone.', ['matter', 'definitely']);
          
          console.log(result);
          &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

          【讨论】:

            【解决方案7】:

            要在数组中搜索,您可以简单地使用 迭代方法 (forEach/ map),并在其中使用 JavaScript 字符串搜索方法

            参考https://www.w3schools.com/jsref/jsref_search.asp

            示例

            const arrayOfLists = ['ape', 'apple', 'auto'];
            const searchString = "A"
            
            let matchingStrings = [];
            
            arrayOfLists.forEach((list) => {
                if (list.toLocaleLowerCase().search(searchString.toLocaleLowerCase()) > -1) {
                    matchingStrings.push(list)
                }
            })
            

            ma​​tchingStrings 数组将包含所有可能出现的列表

            【讨论】:

              猜你喜欢
              • 2022-01-23
              • 2011-07-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-06-12
              相关资源
              最近更新 更多