web-dev-qa-db-ja.com

JavaScriptでは、部分文字列の一致を配列でどのように検索しますか

JavaScriptで配列を検索する必要があります。文字列には追加の番号が割り当てられるため、検索は文字列の一部のみに一致します。次に、完全に一致した配列要素と完全な文字列を返す必要があります。

つまり.

var windowArray = new Array ("item","thing","id-3-text","class");

"id-"を含む配列要素を検索する必要があり、要素内の残りのテキストも取得する必要があります(つまり、"id-3-text")。

ありがとう

46
reub77

特定のケースでは、退屈な古いカウンターでそれを行うことができます:

_var index, value, result;
for (index = 0; index < windowArray.length; ++index) {
    value = windowArray[index];
    if (value.substring(0, 3) === "id-") {
        // You've found it, the full text is in `value`.
        // So you might grab it and break the loop, although
        // really what you do having found it depends on
        // what you need.
        result = value;
        break;
    }
}

// Use `result` here, it will be `undefined` if not found
_

ただし、配列が sparse の場合、適切に設計された_for..in_ループを使用すると、より効率的に実行できます。

_var key, value, result;
for (key in windowArray) {
    if (windowArray.hasOwnProperty(key) && !isNaN(parseInt(key, 10))) {
        value = windowArray[key];
        if (value.substring(0, 3) === "id-") {
            // You've found it, the full text is in `value`.
            // So you might grab it and break the loop, although
            // really what you do having found it depends on
            // what you need.
            result = value;
            break;
        }
    }
}

// Use `result` here, it will be `undefined` if not found
_

hasOwnPropertyおよび!isNaN(parseInt(key, 10))チェックを持たない単純な_for..in_ループに注意してください。 理由は


オフトピック

別の書き方

_var windowArray = new Array ("item","thing","id-3-text","class");
_

_var windowArray = ["item","thing","id-3-text","class"];
_

...これはタイピングが少なく、おそらく(このビットは主観的です)少し読みやすいです。 2つのステートメントの結果はまったく同じです。つまり、これらのコンテンツを持つ新しい配列です。

14
T.J. Crowder

プロジェクトで nderscore.js を使用できる場合、_。filter()配列関数はこれを簡単にします:

// find all strings in array containing 'thi'
var matches = _.filter(
    [ 'item 1', 'thing', 'id-3-text', 'class' ],
    function( s ) { return s.indexOf( 'thi' ) !== -1; }
);

反復関数は、一致に対してtrueを返す限り、必要な処理を実行できます。よく働く。

2017-12-03を更新:
これは今ではかなり時代遅れの回答です。大規模なバッチで最もパフォーマンスの高いオプションではないかもしれませんが、lotより簡潔に記述し、.filter().includes()などのネイティブES6配列/文字列メソッドを使用できます。

// find all strings in array containing 'thi'
const items = ['item 1', 'thing', 'id-3-text', 'class'];
const matches = items.filter(s => s.includes('thi'));

注:String.prototype.includes()のIE11サポートはありません(エッジは動作します)、ポリフィルで問題ないか、単にフォールバックしますindexOf()

36
nickb

ここの人々はこれを非常に難しくしている。次のことを行うだけです...

_myArray.findIndex(element => element.includes("substring"))
_

findIndex() は、配列の要素を反復処理し、いくつかの基準(関数として提供される)に一致する最初の要素のインデックスを返すES6高次メソッドです。この場合、ES6構文を使用して高階関数を宣言しました。 elementは関数(任意の名前)のパラメーターであり、太い矢印は後続の関数を匿名関数として宣言します(複数行にならない限り、中括弧で囲む必要はありません) 。

findIndex()内で、非常に単純なincludes()メソッドを使用して、現在の要素に目的の部分文字列が含まれているかどうかを確認しました。

19
user10302261

単純に古いindexOfの文字列を検索するだけです

arr.forEach(function(a){if (typeof(a) == 'string' && a.indexOf('curl')>-1) console.log(a);})
11
JonnieJS

これを達成するための最も単純なバニラjavascriptコードは

var windowArray = ["item", "thing", "id-3-text", "class", "3-id-text"];
var textToFind = "id-";

//if you only want to match id- as prefix 
var matches = windowArray.filter(function(windowValue){
  if(windowValue) {
      return (windowValue.substring(0, textToFind.length) === textToFind);
  }
}); //["id-3-text"]

//if you want to match id- string exists at any position
var matches = windowArray.filter(function(windowValue){
  if(windowValue) {
      return windowValue.indexOf(textToFind) >= 0;
  }
}); //["id-3-text", "3-id-text"]
2
Karthik

いくつかの選択肢とその効率の魅力的な調査については、John Resigの最近の投稿を参照してください。

(そこで議論されている問題は少し異なっており、干し草の山の要素は針の接頭辞であり、逆ではありませんが、ほとんどの解決策は簡単に適応できます。)

2
Tgr

ref: javascriptでは、部分文字列の一致を配列でどのように検索しますか

ここに示されている解決策は、 solution 4556343#455634 とは異なり、汎用的なものです。これは、join()の文字列を識別するための事前の解析を必要とします。
また、そのコードでは/!id-[^!]*/がより正確で、/![^!]*id-[^!]*/は質問パラメーターに適合します:

  1. 「配列を検索...」(関数、配列、オブジェクトなどではなく、文字列または数値の)
  2. 「一致する文字列の一部のみ」(一致はどこでも可能)
  3. 「...一致した...要素を返す」(「... the ... elementS」のように、ALLではなく単数)
  4. 「完全な文字列で」(引用符を含む)

... NetScape/FireFoxソリューション(JSONソリューションについては以下を参照):

javascript:         /* "one-liner" statement solution */
   alert(
      ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] .
         toSource() . match( new RegExp( 
            '[^\\\\]("([^"]|\\\\")*' + 'id-' + '([^"]|\\\\")*[^\\\\]")' ) ) [1]
   );

または

javascript:
   ID = 'id-' ;
   QS = '([^"]|\\\\")*' ;           /* only strings with escaped double quotes */
   RE = '[^\\\\]("' +QS+ ID +QS+ '[^\\\\]")' ;/* escaper of escaper of escaper */
   RE = new RegExp( RE ) ;
   RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
   alert(RA.toSource().match(RE)[1]) ;

"x'!x'\"id-2"を表示します。
おそらく、すべての一致を見つけるために配列をレイドすることは「よりクリーン」です。

/* literally (? backslash star escape quotes it!) not true, it has this one v  */
javascript:                            /* purely functional - it has no ... =! */
   RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
   function findInRA(ra,id){
      ra.unshift(void 0) ;                                     /* cheat the [" */
      return ra . toSource() . match( new RegExp(
             '[^\\\\]"' + '([^"]|\\\\")*' + id + '([^"]|\\\\")*' + '[^\\\\]"' ,
             'g' ) ) ;
   }
   alert( findInRA( RA, 'id-' ) . join('\n\n') ) ;

ディスプレイ:

 "x '!x' \" id-2 "
 
" '\ "id-1 \" "
 
" id- 3-text "

使用、JSON.stringify()

javascript:                             /* needs prefix cleaning */
   RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
   function findInRA(ra,id){
      return JSON.stringify( ra ) . match( new RegExp(
             '[^\\\\]"([^"]|\\\\")*' + id + '([^"]|\\\\")*[^\\\\]"' ,
             'g' ) ) ;
   }
   alert( findInRA( RA, 'id-' ) . join('\n\n') ) ;

ディスプレイ:

 ["x '!x' \" id-2 "
 
、" '\ "id-1 \" "
 
、 「id-3-text」

シワ:

  • 「エスケープされていない」グローバルRegExpは、/[^\]"([^"]|\")*id-([^"]|\")*[^\]"/gであり、\が文字通り見つかります。 ([^"]|\")*"としてエスケープされたすべての\"の文字列と一致させるには、\自体を([^"]|\\")*としてエスケープする必要があります。これがid-と連結される文字列として参照される場合、各\を再度エスケープする必要があるため、([^"]|\\\\")*
  • \*"、...を持つ検索IDも、.toSource()またはJSONまたはを介してエスケープする必要があります。 .。
  • null検索結果は、''(または""!を含むEMPTY文字列のように")または[](すべての検索)を返す必要があります。
  • 検索結果をさらに処理するためにプログラムコードに組み込む場合は、eval()などのeval('['+findInRA(RA,ID).join(',')+']')が必要です。

-------------------------------------------------- ------------------------------

余談:
襲撃と脱出?このコードは競合していますか?
/* it has no ... =! */の記号論、構文およびセマンティクスは、引用符付きリテラルの競合のエスケープを明確に説明します。

"no ="はどういう意味ですか:

  • javascript:alert('\x3D')のように「no '='記号」(実行しないでください!
  • 「代入演算子を使用したjavascriptステートメントはありません」、
  • 「他のコードとまったく同じものがない」などの「等しくない」(以前のコードソリューションは、機能的に同等なものがあることを示しています)
  • ...

別のレベルでの引用は、以下のイミディエイトモードJavaScriptプロトコルURIを使用して行うこともできます。 (//コメントは改行で終わる(別名nl、ctrl-J、LineFeed、ASCII 10進数10、8進数12、16進数A))。キー、URIを呼び出します。)

javascript:/* a comment */  alert('visible')                                ;
javascript:// a comment ;   alert(  'not'  ) this is all comment             %0A;
javascript:// a comment %0A alert('visible but  %\0A  is wrong ')   // X     %0A
javascript:// a comment %0A alert('visible but %'+'0A is a pain to type')   ;

注:最初のjavascript:をURIスキームまたはプロトコルとして使用し、残りをJSラベルとして使用するには、javascript:行のいずれかをイミディエイトモードURI(少なくとも、FireFoxで?)としてカットアンドペーストします。

1
Ekim
let url = item.product_image_urls.filter(arr=>arr.match("homepage")!==null)

文字列が一致するフィルター配列。簡単で1行のコードです。

1
Biswajit
myArray.find(element => element.includes("substring"));

これにより、配列から実際の要素が返されます。

myArray.findIndex(element => element.includes("substring"));

これは、配列から要素のインデックスを返します。

1
smnth90

別の可能性は

var res = /!id-[^!]*/.exec("!"+windowArray.join("!"));
return res && res[0].substr(1);

iMOは、特別な文字区切り記号(ここでは "!"を使用)を使用できる場合に意味があります。配列は定数またはほぼ一定であるため(結合は1回またはまれにしか計算できません)、完全な文字列は検索するプレフィックス。

0
6502

これは私のために働いた。

    const filterData = this.state.data2.filter(item=>((item.name.includes(text)) || (item.surname.includes(text)) || (item.email.includes(text)) || (item.userId === Number(text))) ) ;
0

これは、一致するすべての値の配列を提供する予想スニペットです。

var windowArray = new Array ("item","thing","id-3-text","class");

var result = [];
windowArray.forEach(val => {
  if(val && val.includes('id-')) {
    result.Push(val);
  }
});

console.log(result);
0
Tushar Walzade

これはあなたに役立つと思います。同様の問題がありました。配列が次のように見える場合:

var array = ["page1","1973","Jimmy"]; 

単純な「for」ループを実行して、一致したときに配列内のインスタンスを返すことができます。

var c; 
for (i = 0; i < array.length; i++) {
if (array[i].indexOf("page") > -1){ 
c = i;}
} 

空の変数cを作成して、答えをホストします。次に、配列をループして、配列オブジェクト(例: "page1")がindexOf( "page")に一致する場所を見つけます。この場合、0(最初の結果)です

さらにサポートが必要な場合は、喜んで拡大してください。

0