variable - Wie überprüft man, ob eine Zeichenfolge Text aus einem Array von Teilzeichenfolgen in JavaScript enthält?




value contains js (8)

Ziemlich einfach. In Javascript muss ich prüfen, ob eine Zeichenfolge Teilzeichenfolgen in einem Array enthält.


Aufbauend auf TJ Crowders Antwort

Verwenden von Escape-RegExp, um das Auftreten von mindestens einer der Teilzeichenfolgen mindestens einmal zu testen.

function buildSearch(substrings) {
  return new RegExp(
    substrings
    .map(function (s) {return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');})
    .join('{1,}|') + '{1,}'
  );
}


var pattern = buildSearch(['hello','world']);

console.log(pattern.test('hello there'));
console.log(pattern.test('what a wonderful world'));
console.log(pattern.test('my name is ...'));


Das ist super spät, aber ich bin gerade auf dieses Problem gestoßen. In meinem eigenen Projekt habe ich Folgendes verwendet, um zu überprüfen, ob ein String in einem Array war:

["a","b"].includes('a')     // true
["a","b"].includes('b')     // true
["a","b"].includes('c')     // false

Auf diese Weise können Sie ein vordefiniertes Array verwenden und prüfen, ob es eine Zeichenfolge enthält:

var parameters = ['a','b']
parameters.includes('a')    // true

Für Leute, die googeln,

Die solide Antwort sollte sein.

const substrings = ['connect', 'ready'];
const str = 'disconnect';
if (substrings.some(v => str === v)) {
   // Will only return when the `str` is included in the `substrings`
}

Javascript-Funktion, um ein Array von Tags oder Schlüsselwörtern mit einem Suchstring oder einem Array von Suchstrings zu durchsuchen. (Verwendet ES5 einige Array-Methode und ES6 Pfeilfunktionen )

// returns true for 1 or more matches, where 'a' is an array and 'b' is a search string or an array of multiple search strings
function contains(a, b) {
    // array matches
    if (Array.isArray(b)) {
        return b.some(x => a.indexOf(x) > -1);
    }
    // string match
    return a.indexOf(b) > -1;
}

Beispielverwendung:

var a = ["a","b","c","d","e"];
var b = ["a","b"];
if ( contains(a, b) ) {
    // 1 or more matches found
}

Nicht, dass ich vorschlage, dass Sie den Prototyp von String erweitern oder modifizieren, aber das habe ich getan:

String.prototype.includes()

String.prototype.includes = function (includes) {
    console.warn("String.prototype.includes() has been modified.");
    return function (searchString, position) {
        if (searchString instanceof Array) {
            for (var i = 0; i < searchString.length; i++) {
                if (includes.call(this, searchString[i], position)) {
                    return true;
                }
            }
            return false;
        } else {
            return includes.call(this, searchString, position);
        }
    }
}(String.prototype.includes);

console.log('"Hello, World!".includes("foo");',          "Hello, World!".includes("foo")           ); // false
console.log('"Hello, World!".includes(",");',            "Hello, World!".includes(",")             ); // true
console.log('"Hello, World!".includes(["foo", ","])',    "Hello, World!".includes(["foo", ","])    ); // true
console.log('"Hello, World!".includes(["foo", ","], 6)', "Hello, World!".includes(["foo", ","], 6) ); // false


Wenn das Array nicht groß ist, können Sie die Zeichenfolge für jeden Teilstring indexOf() mit dem indexOf() und überprüfen. Alternativ könnten Sie einen regulären Ausdruck mit Teilstrings als Alternativen konstruieren, die effizienter sein können oder auch nicht.


function containsAny(str, substrings) {
    for (var i = 0; i != substrings.length; i++) {
       var substring = substrings[i];
       if (str.indexOf(substring) != - 1) {
         return substring;
       }
    }
    return null; 
}

var result = containsAny("defg", ["ab", "cd", "ef"]);
console.log("String was found in substring " + result);

var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = 0, len = arr.length; i < len; ++i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}

edit: Wenn die Reihenfolge der Tests keine Rolle spielt, könnte man diese verwenden (mit nur einer Variablen):

var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = arr.length - 1; i >= 0; --i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}




contains