检查字符串是否包含数组元素的任何部分

时间:2013-08-05 05:48:05

标签: javascript arrays string

我刚开始学习javascript而且我正在开发小型Chrome扩展程序,用于检查某个网站的项目列表中的任何项目 包含用户提供的关键字。我正在寻找一些方法来帮助比较一个字符串和一个字符串数组。

所以我有这些变量:

var itemDetails = '[alter] saber 1/8 figure unopened';
var trackingList = ['alter figure', 'magic', 'sword art']; 

我需要检查itemDetails是否包含trackingList中的任何字符串。我知道我可以这样使用indexOf()

function checkArray(str, arr){
   for(var i=0; i < arr.length; i++){
       if(str.indexOf(arr[i]) > -1)
           return true;
   }
   return false;
}

checkArray(itemDetails,trackingList); // returns false

但是,对于包含多个单词的字符串,例如“alter figure”,只要字符串中的两个单词都出现在checkArray()中的任何位置,我希望itemDetails返回true。因此checkArray()应该在上面的示例中返回true,因为'alter'和'figure'都在itemDetails中。

我目前使用的方法是拆分trackingList中的每个元素:

function splitTrackList(arr){
    var newarr = [];
    for(var i = 0; i < arr.length; i++){
        newarr[i] = arr[i].split(" ");
    }
    return newarr;
}

trackList = splitTrackList(trackList); 
// [['alter', 'figure'], ['magic'], ['sword', 'art']]

然后使用indexOf()进行比较:

function newCheckArray(str, arr){
    var passed = true;
    for(var i=0; i < arr.length; i++){
        for(var j=0; j < arr[i].length; j++){
            if(str.indexOf(arr[i][j]) == -1){
                passed = false;
                break;
            }
            else passed = true;
        }

        if(passed) //stop loop if match found
            break;
    }
    return passed;
}

newCheckArray(itemDetails,trackingList); //returns true

我的方法到目前为止有效,但我猜测有一种更快/更有效的方法。请让我知道你在想什么。先感谢您。

4 个答案:

答案 0 :(得分:2)

我会做像

这样的事情

https://jsfiddle.net/denov/FXjXq/3/

var arr = [
    "cat dog mouse",
    "blue yellow green",
    "pizza burrito hamburger"
];

function isInString(needle, haystack) {
    return new RegExp('\\b' + needle + '\\b').test(haystack);
}

function checkForStringInArray(stringToFind, arr) {
    var inString = false;
    for(var i=0; i < arr.length; i++){ 
        inString = isInString(stringToFind, arr[i]);
        if(inString) break;
    }
    return inString;
}

var inString = checkForStringInArray('yellow', arr);

答案 1 :(得分:1)

您可以使用正则表达式。我给你举个例子,虽然它不是最有效的

function checkArray(str, arr){
   for(var i=0; i < arr.length; i++){
       if(str.match((".*" + arr[i].trim() + ".*").replace(" ", ".*")))
           return true;
   }
   return false;
}

这里我将字符串“key1 keyn”更改为“。* key1。 keyn。”,以便它可以匹配字符串中的所有键。请记住,如果它们是另一个词的一部分,这将匹配它们。祝你好运。

P.S。学习正则表达式。它们在几乎所有语言中都非常重要。

答案 2 :(得分:1)

这应该有效:

function checkArray(str, arr){
      for (var j = 0; j < arr.length;j++) {
          wordtab = splitTrackList(arr[j]);
          for(var i=0; i < tab.length; i++){
               if(str.indexOf(wordtab[i]) > -1)
                   return true;
           }
       }
    return false;
}

答案 3 :(得分:0)

这是一个使用lambda表达式的解决方案:

config : Object
       L->  headers: Object
             L->     Accept : "application/json, text/plain, */*"
                     Auth-Token : "1234"

https://jsfiddle.net/wrz1m0b5/

正则表达式解决方案仅在单词顺序正确时才有效。