ජාවාස්ක්‍රිප්ට් හි නූලක් උපස්ථරයක් අඩංගු දැයි පරීක්ෂා කරන්නේ කෙසේද?


7427

සාමාන්‍යයෙන් මම String.contains()ක්‍රමයක් බලාපොරොත්තු වෙමි , නමුත් එකක් ඇති බවක් නොපෙනේ.

මේ සඳහා පරීක්ෂා කිරීමට සාධාරණ ක්‍රමයක් කුමක්ද?

Answers:


13783

ECMAScript 6 හඳුන්වා දී ඇත String.prototype.includes:

const string = "foo";
const substring = "oo";

console.log(string.includes(substring));

includes ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් සහාය නැත. ECMAScript 5 හෝ ඊට වැඩි පරිසරයක, String.prototype.indexOfඋපස්ථරයක් සොයාගත නොහැකි වූ විට -1 නැවත ලබා දෙන භාවිතය :

var string = "foo";
var substring = "oo";

console.log(string.indexOf(substring) !== -1);


25
මම IE ට කැමති නැත, නමුත් ඔබට බොහෝ දුරට සමාන වන කාර්යයන් දෙකක් තිබේ නම්, සහ අනෙක් ඒවාට වඩා හොඳ සහයෝගයක් තිබේ නම්, මම හිතන්නේ ඔබ වඩා හොඳ සහය දක්වන එකක් තෝරා ගත යුතුද? ඉතින් indexOf()ඒක තමයි ...
rob74

3
සිද්ධි සංවේදී සෙවීමක් කළ හැකිද?
එරික් මැක්වින්නර්

18
string.toUpperCase().includes(substring.toUpperCase())
රොඩ්රිගෝ පින්ටෝ

2
@EricMcWinNEr /regexpattern/i.test(str)-> i කොඩි නඩුවේ කරු අසංවේදී සඳහා කි්රයා
සංග්රහයේ පිස්සෙක්

මෙය ගූගල් ඇප් ස්ක්‍රිප්ට් හි මට වැඩ කරන බවක් නොපෙනේ.
රයන්

561

ඒ නිසා එය String.prototype.includesES6 දී :

"potato".includes("to");
> true

ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් හෝ වෙනත් පැරණි බ්‍රව්සර් වල මෙය ක්‍රියාත්මක නොවන බව සලකන්න . පැරණි බ්‍රව්සර්වල එය ක්‍රියාත්මක කිරීම සඳහා, ඔබට බාබෙල් වැනි ප්‍රවාහකයෙකු, එස් 6-ෂිම් වැනි ෂිම් පුස්තකාලයක් හෝ එම්ඩීඑන් වෙතින් මෙම පොලිෆිල් භාවිතා කිරීමට අවශ්‍ය විය හැකිය :

if (!String.prototype.includes) {
  String.prototype.includes = function(search, start) {
    'use strict';
    if (typeof start !== 'number') {
      start = 0;
    }

    if (start + search.length > this.length) {
      return false;
    } else {
      return this.indexOf(search, start) !== -1;
    }
  };
}

3
"potato".includes("to");එය කර බාබෙල් හරහා ධාවනය කරන්න .
ඩර්ක් ජෑන් ස්පීල්මන්

1
ඇතුළත් කිරීම කනගාටුවට කරුණකි
ස්වීට් චිලි ෆිලී

@eliocs ඔබට මේ සඳහා පිළිතුරු දිය හැකිය. මට ඕනෑම පණිවිඩයක් ලැබෙනවා. පණිවිඩය වෙනස් කිරීමට අවශ්‍යයි stackoverflow.com/questions/61273744/…
sejn

1
ඒ සඳහා තවත් ප්ලස් එකක් වන්නේ සිද්ධි සංවේදී වීමයි. "boot".includes("T")isfalse
Jonatas CD

47

තවත් විකල්පයක් වන්නේ KMP (Knuth-Morris-Pratt) ය.

එය length- සඳහා KMP ඇල්ගොරිතමය සෙවුම් මීටර් substring වූ length- දී n string නරකම දී සාමාන්ය ( n + මීටර් ) කාලය, ඕ නරකම සාපේක්ෂව ( nමීටර් වූ බොළඳ ඇල්ගොරිතමය සඳහා) එසේ KMP මැයි භාවිතා නරකම කාල සංකීර්ණත්වය ගැන ඔබ සැලකිලිමත් වන්නේ නම් සාධාරණ වන්න.

Https://www.nayuki.io/res/knuth-morris-pratt-string-matching/kmp-string-matcher.js වෙතින් ලබාගත් ව්‍යාපෘති නායුකි විසින් ජාවාස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීම මෙන්න :

// Searches for the given pattern string in the given text string using the Knuth-Morris-Pratt string matching algorithm.
// If the pattern is found, this returns the index of the start of the earliest match in 'text'. Otherwise -1 is returned.

function kmpSearch(pattern, text) {
  if (pattern.length == 0)
    return 0; // Immediate match

  // Compute longest suffix-prefix table
  var lsp = [0]; // Base case
  for (var i = 1; i < pattern.length; i++) {
    var j = lsp[i - 1]; // Start by assuming we're extending the previous LSP
    while (j > 0 && pattern.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1];
    if (pattern.charAt(i) == pattern.charAt(j))
      j++;
    lsp.push(j);
  }

  // Walk through text string
  var j = 0; // Number of chars matched in pattern
  for (var i = 0; i < text.length; i++) {
    while (j > 0 && text.charAt(i) != pattern.charAt(j))
      j = lsp[j - 1]; // Fall back in the pattern
    if (text.charAt(i) == pattern.charAt(j)) {
      j++; // Next char matched, increment position
      if (j == pattern.length)
        return i - (j - 1);
    }
  }
  return -1; // Not found
}

console.log(kmpSearch('ays', 'haystack') != -1) // true
console.log(kmpSearch('asdf', 'haystack') != -1) // false


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.