2

我刚开始学习 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. 所以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

4 回答 4

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);
于 2013-08-05T06:14:01.380 回答
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. ”,因此它可以匹配字符串中任何位置的这些键。请记住,如果它们是另一个单词的一部分,这将匹配它们。祝你好运。

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

于 2013-08-05T05:59:13.070 回答
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;
}
于 2013-08-05T06:07:10.793 回答
0

这是一个带有 lambda 表达式的解决方案:

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

if(trackingList.map(str => str.split(" ")).filter(arrtemp => arrtemp.filter(strin => itemDetails.indexOf(strin) > -1).length == arrtemp.length).length > 0) {
    console.debug("true");
} else {
    console.debug("false")
}

if(trackingList2.map(str => str.split(" ")).filter(arrtemp => arrtemp.filter(strin => itemDetails.indexOf(strin) > -1).length == arrtemp.length).length > 0) {
    console.debug("true");
} else {
    console.debug("false")
}

https://jsfiddle.net/wrz1m0b5/

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

于 2016-09-17T06:25:02.157 回答