如何在字符串数组中搜索字符串

54
在查看其他帖子后,我觉得必须提出这个问题。我看了一下如何在JavaScript中检查数组是否包含对象?在JavaScript数组中查找项的最佳方式是什么?,但无法使那里的代码生效。
我正在将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' 的行。
因此,我希望编写一个函数,返回包含 'height' 的项的索引。
幸运的是,这个数组中没有重复项,所以只有一个匹配项。
使用简单的对象搜索会返回 'false'。
有什么想法吗?
8个回答

62

只需要遍历数组并查找正则表达式,就像这样简单。

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

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


是的,谢谢。实际上我已经安装了Firebug,但不知何故忘记启用它了。期待修复,再次感谢。 - someuser
这个应该被称为“searchStringArray”,因为搜索可以使用正则表达式而不仅仅是字符串。 - Steven Lu
这将只找到数组中第一个匹配的元素,而不是所有匹配的元素。 - Buttle Butkus
我用这个解决方案一直得到"TypeError: strArray[i].match不是一个函数"的错误。 - Christoffer
2
因为在这个讨论开始时,array.indexOf()和array.find()并不存在。 - Roger Krueger
显示剩余2条评论

23
你可以在 JavaScript 中使用 Array.prototype.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);

如果我需要在abc上加123,在def上加456,该怎么办? - Saurav

12

扩展您链接到的 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/)

你还可以返回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;
}

不错,同样的想法但更通用。 - Aleadam

5

如果您只是想在字符串值数组中查找第一个子字符串匹配项,则避免使用正则表达式会更快。 您可以添加自己的数组搜索函数:

代码

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),则返回该索引。


3

简洁易懂的代码,支持多个单词

let strArray = ["Please locate where 'locate' occurs!","Hi Hashem it","do it","for free"];

strArray.filter(word=> word.includes("it"));
Output
//Hi Hashem it,do it

//-------------------

strArray.filter(word=> word.includes("do it"));
Output
//do it

工作得很好,代码紧凑且易读! - undefined

0

要在数组中搜索,您可以简单地使用迭代方法(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)
    }
})

matchingStrings 数组将包含所有可能出现的列表


0

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);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


0

如果有人想要一个小型的动态搜索。

 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" } ]

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