javascript - Cum verific dacă un șir conține un subșir?


Am un coș de cumpărături care afișează opțiuni de produse într-un meniu derulant și dacă selectează „da”, vreau să fac vizibile câteva alte câmpuri de pe pagină.

Problema este că coșul de cumpărături include, de asemenea, modificatorul de preț în text, care poate fi diferit pentru fiecare produs. Codul următor funcționează:

$(document).ready(function() {
    $('select[id="Engraving"]').change(function() {
        var str = $('select[id="Engraving"] option:selected').text();
        if (str == "Yes (+ $6.95)") {
            $('.engraving').show();
        } else {
            $('.engraving').hide();
        }
    });
});

Totuși, aș prefera să folosesc ceva de genul acesta, care nu funcționează:

$(document).ready(function() {
    $('select[id="Engraving"]').change(function() {
        var str = $('select[id="Engraving"] option:selected').text();
        if (str *= "Yes") {
            $('.engraving').show();
        } else {
            $('.engraving').hide();
        }
    });
});

Vreau să efectuez acțiunea doar dacă opțiunea selectată conține cuvântul „Da” și aș ignora modificatorul de preț.

Răspuns #1

Așa:

if (str.indexOf("Yes") >= 0)

...sau poți folosi operatorul tilde:

if (~str.indexOf("Yes"))

Acest lucru funcționează deoarece indexOf() returnează -1 dacă șirul nu a fost găsit deloc.

Rețineți că aceasta distinge între majuscule și minuscule.
Dacă doriți o căutare care să nu țină cont de majuscule, puteți scrie

if (str.toLowerCase().indexOf("yes") >= 0)

Aur :

if (/yes/i.test(str))

Ultimul este o expresie regulată sau regex.

Defalcarea expresiei regex:

  • / indică faptul că acesta este un regex
  • yes înseamnă că expresia regulată va găsi acele caractere exacte în acea ordine exactă
  • / termină expresia regulată
  • i setează expresia regulată ca fiind insensibilă la majuscule și minuscule
  • .test(str) determină dacă expresia regulată corespunde cu str. Pe scurt, înseamnă că va vedea dacă poate găsi literele y, e și s în acea ordine exactă, indiferent de majuscule sau minuscule, în variabila str.

Răspunsul #2

Ai putea folosi căutarea sau potrivirea pentru asta.

str.search( 'Yes' )

va returna poziția potrivirii, sau -1 dacă nu este găsită.

Răspunsul #3

Este destul de târziu să scriu acest răspuns, dar m-am gândit să-l includ oricum. String.prototype are acum o metodă includes care poate verifica un substring. Această metodă este sensibilă la majuscule și minuscule.

var str = 'It was a good date';
console.log(str.includes('good')); // shows true
console.log(str.includes('Good')); // shows false

Pentru a verifica existența unui substring, se poate adopta următoarea abordare:

if (mainString.toLowerCase().includes(substringToCheck.toLowerCase())) {
    // mainString contains substringToCheck
}

Consultă documentația pentru a afla mai multe.

Răspunsul #4

O altă cale:

var testStr = "This is a test";

if(testStr.contains("test")){
    alert("String Found");
}

** Testat pe Firefox, Safari 6 și Chrome 36 **

Răspunsul #5

ECMAScript 6 introduce String.prototype.includes, anterior numit contains.

Poate fi folosit astfel:

'foobar'.includes('foo'); // true
'foobar'.includes('baz'); // false

De asemenea, acceptă un al doilea argument opțional care specifică poziția de la care să înceapă căutarea:

'foobar'.includes('foo', 1); // false
'foobar'.includes('bar', 1); // true

Poate fi implementat prin polyfill pentru a funcționa pe browserele vechi.

Răspunsul #6

Metoda includes() determină dacă un șir de caractere poate fi găsit într-un alt șir de caractere, returnând true sau false, după caz.

Sintaxă :-string.includes(searchString[, position])

searchString:-Un șir de caractere care trebuie căutat în acest șir.

position: -Opțional. Poziția în acest șir de caractere de la care să înceapă căutarea pentru searchString; implicit este 0.

string = 'LOL';
console.log(string.includes('lol')); // returns false 
console.log(string.includes('LOL')); // returns true 

Răspunsul #7

Poți folosi acest Polyfill în IE și Chrome

if (!('contains' in String.prototype)) {
    String.prototype.contains = function (str, startIndex) {
        "use strict";
        return -1 !== String.prototype.indexOf.call(this, str, startIndex);
    };
}