String.prototype.indexOf を使う(部分一致)
String.prototype.search
は正規表現オブジェクトでコストが高いので String.prototype.indexOf
が良いと思います。
node.js で使えるか分かりませんが、可能なら String.prototype.includes
の方が高速かもしれません(ブラウザの最適化による)。
また、原理的には繰り返し文で最速は while
文になります。
JavaScript
1var words = ['sample', 'alert', 'community'],
2 input = '<a>abcabacaa,sample,aaaaa</a>',
3 i = words.length;
4
5input = input.replace(/^<[^>]*>|<[^>]*>$/g, ''); // 余計な文字列は削っておく
6
7while (i--) {
8 if (input.indexOf(words[i]) !== -1) {
9 // フラグ変数 match を使わず、ここでマッチした時の処理もやっておく
10 console.log(words[i]); // "sample"
11 break;
12 }
13}
これでも問題なく動くのですが、words配列の文字列は最大300件くらいになるので負荷なども考えてシンプルな形にしたいと考えています。
誤解されがちですが、「最速のコード」が「最小のコード」とは限りません。
関数はコストが重いのでパフォーマンスを稼ぐ為に Statement
や Expression
にしてコードが長くなる事もあります。
Array.prototype.indexOf を使う(完全一致)
単語の照合が完全一致でよければ Array.prototype.indexOf
を利用可能です。
また、input
を split
で分解した単語数が words
の単語数(300)を下回っている場合は検索対象を逆転する事で繰り返し処理の回数を下げる事が可能です。
JavaScript
1'use strict';
2var words = ['sample', 'alert', 'community'],
3 input = '<a>abcabacaa,sample,aaaaa</a>'.replace(/^<[^>]*>|<[^>]*>$/g, '').split(','),
4 i = input.length;
5
6while (i--) {
7 if (words.indexOf(input[i]) !== -1) {
8 // フラグ変数 match を使わず、ここでマッチした時の処理もやっておく
9 console.log(input[i]); // "sample"
10 break;
11 }
12}
(2016/02/24 13:20追記) Array.prototype.indexOf のコードを追加しました。
Re: fagai さん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/24 04:08
2016/02/24 04:43 編集
2016/02/24 04:15 編集
2016/02/24 04:23
2016/02/24 04:46
2016/02/24 04:49
2016/02/24 05:11