javascript - 含ん - 文字列が "StartsWith"別の文字列かどうかをチェックする方法?



string javascript search (12)

ECMAScript 6の.startsWithメソッドを使用できますが、 まだすべてのブラウザでサポートされていません 。 shim / polyfillを使用して、それをサポートしていないブラウザに追加することができます。 仕様に記載されているすべての詳細に準拠する実装を作成するのは少し複雑です。この答えで定義されているバージョンは動作しません。 忠実なシムが必要な場合は、次のいずれかを使用します。

メソッドをシミしたら(または既にブラウザとJavaScriptエンジンをサポートしている場合のみ)、次のように使用できます:

"Hello World!".startsWith("He"); // true

var haystack = "Hello world";
var prefix = 'orl';
haystack.startsWith(prefix); // false

どのようにC#のString.StartsWithに相当するJavaScriptを記述しますか?

var haystack = 'hello world';
var needle = 'he';

haystack.startsWith(needle) == true

注:これは古い質問であり、ECMAScript 2015(ES6)のコメントで指摘されているように、 .startsWithメソッドが導入されました。 しかし、このアップデート(2015年)を書いている時点では、 ブラウザのサポートは完全ではありません


Answer #1

.lastIndexOf別の方法:

haystack.lastIndexOf(needle, 0) === 0

これは、 haystack索引0から始まるneedle発生について、 haystackを逆向きに見ます。 つまり、 haystackneedle始まるかどうかを確認するだけです。

原則として、これには他のいくつかのアプローチよりもパフォーマンス上の利点があります。

  • haystack全体を検索するわけではありません。
  • 新しい一時文字列を作成してすぐにそれを破棄しません。

Answer #2

startsWith()endsWith()startsWith()て作業している場合は、先行スペースに注意する必要があります。 完全な例を次に示します。

var str1 = " Your String Value Here.!! "; // Starts & ends with spaces    
if (str1.startsWith("Your")) { }  // returns FALSE due to the leading spaces…
if (str1.endsWith("Here.!!")) { } // returns FALSE due to trailing spaces…

var str2 = str1.trim(); // Removes all spaces (and other white-space) from start and end of `str1`.
if (str2.startsWith("Your")) { }  // returns TRUE
if (str2.endsWith("Here.!!")) { } // returns TRUE

Answer #3

ここでの答えに基づいて、これは私が現在使っているバージョンです.JPerfのテストに基づいて最高のパフォーマンスを発揮するようです(そして、私が知る限り機能的に完成しています)。

if(typeof String.prototype.startsWith != 'function'){
    String.prototype.startsWith = function(str){
        if(str == null) return false;
        var i = str.length;
        if(this.length < i) return false;
        for(--i; (i >= 0) && (this[i] === str[i]); --i) continue;
        return i < 0;
    }
}

これは、ここからstartsWith2に基づいています: http://jsperf.com/startswith2/6 ://jsperf.com/startswith2/6。 私は小さなパフォーマンス改善のための小さな微調整を追加し、以来、比較文字列がnullまたは未定義であることのチェックを追加し、CMSの答えのテクニックを使用してStringプロトタイプに追加するように変換しました。

この実装では、このMozilla Developer Networkページに記載されている "position"パラメータはサポートされていませんが、ECMAScriptプロポーザルの一部ではないようです。


Answer #4

これは非常に普及しているので、ECMA 6ではこのメソッドの実装があり、将来の問題や涙を防ぐために '公式'ポリフィルを使用する必要があることを前提にしておくことは価値があると思います。

幸いなことに、Mozillaの専門家は、

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}

これには、ECMA 6への移行時に正常に無視されるという利点があります。


Answer #5

また、配列プロトタイプの独自のプロトタイプ/拡張を作成することで、文字列で始まる配列のすべてのメンバーを返すこともできます

Array.prototype.mySearch = function (target) {
    if (typeof String.prototype.startsWith != 'function') {
        String.prototype.startsWith = function (str){
        return this.slice(0, str.length) == str;
      };
    }
    var retValues = [];
    for (var i = 0; i < this.length; i++) {
        if (this[i].startsWith(target)) { retValues.push(this[i]); }
    }
    return retValues;
};

それを使うには:

var myArray = ['Hello', 'Helium', 'Hideout', 'Hamster'];
var myResult = myArray.mySearch('Hel');
// result -> Hello, Helium

Answer #6

ベストソリューション:

function startsWith(str, word) {
    return str.lastIndexOf(word, 0) === 0;
}

startsWith("aaa", "a")
true
startsWith("aaa", "ab")
false
startsWith("abc", "abc")
true
startsWith("abc", "c")
false
startsWith("abc", "a")
true
startsWith("abc", "ba")
false
startsWith("abc", "ab")
true

あなたがそれを必要とするなら、ここにendsWithがあります:

function endsWith(str, word) {
    return str.indexOf(word, str.length - word.length) !== -1;
}

それをStringにプロトタイプ化することを好む人にとって:

String.prototype.startsWith || (String.prototype.startsWith = function(word) {
    return this.lastIndexOf(word, 0) === 0;
});

String.prototype.endsWith   || (String.prototype.endsWith = function(word) {
    return this.indexOf(word, this.length - word.length) !== -1;
});

使用法:

"abc".startsWith("ab")
true
"c".ensdWith("c") 
true

Answer #7

最も優れた解決策は、ライブラリコールの使用をやめ、2つの配列で作業していることを認識することです。 手巻き実装は、ここで見た他のすべてのソリューションよりも短く、高速です。

function startsWith2(str, prefix) {
    if (str.length < prefix.length)
        return false;
    for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i)
        continue;
    return i < 0;
}

パフォーマンスの比較(成功と失敗)については、 http://jsperf.com/startswith2/4参照してください。 (私が切ったかもしれない後のバージョンを確認してください)


Answer #8

私はちょうどこれについて私の意見を追加したい。

私はちょうどこのように使うことができると思います:

var haystack = 'hello world';
var needle = 'he';

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}

Answer #9

私はパフォーマンスを探していたので、jsperfを通して機能を実行しました。 私はさまざまなサイズの件名と検索文字列に対して関数をテストしました。すべてのメソッドが異なる入力の異なるパフォーマンスを示すようです。 一般的なパターンは、検索文字列の長さが長くなるにつれてパフォーマンスが低下することです。

全体の勝者はsubstr(ing)メソッドであるsubstr(ing)が分かりsubstr(ing)

https://jsperf.com/javascript-string-startswith


Answer #10
data.substring(0, input.length) === input

Answer #11
var str = 'hol';
var data = 'hola mundo';
if (data.length >= str.length && data.substring(0, str.length) == str)
    return true;
else
    return false;




startswith