2

私はJavaScriptの学習を始めたばかりで、特定のWebサイトのアイテムリストをチェックして、ユーザーが提供したキーワードを含むアイテムをチェックする小さなクロム拡張に取り組んでいます。文字列を文字列の配列と比較する方法に関するヘルプを探しています。

だから私はこれらの変数を持っています:

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()文字列の場合、文字列内の両方の単語が のどこかに現れる限り、true を返しますitemDetails。' alter checkArray()' と 'figure' の両方が にあるため、上記の例では true を返す必要があり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 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 に答える
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 に答える
0

ラムダ式を使用したソリューションは次のとおりです。

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 に答える