teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

Array\.prototype\.indexOf のコードを追加

2016/02/24 04:21

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,3 +1,5 @@
1
+ # String.prototype.indexOf を使う(部分一致)
2
+
1
3
  `String.prototype.search` は正規表現オブジェクトでコストが高いので `String.prototype.indexOf` が良いと思います。
2
4
  node.js で使えるか分かりませんが、可能なら `String.prototype.includes` の方が高速かもしれません(ブラウザの最適化による)。
3
5
  また、原理的には繰り返し文で最速は `while` 文になります。
@@ -26,4 +28,26 @@
26
28
  誤解されがちですが、「最速のコード」が「最小のコード」とは限りません。
27
29
  関数はコストが重いのでパフォーマンスを稼ぐ為に `Statement` や `Expression` にしてコードが長くなる事もあります。
28
30
 
31
+ # Array.prototype.indexOf を使う(完全一致)
32
+
33
+ 単語の照合が完全一致でよければ `Array.prototype.indexOf` を利用可能です。
34
+ また、`input` を `split` で分解した単語数が `words` の単語数(300)を下回っている場合は検索対象を逆転する事で繰り返し処理の回数を下げる事が可能です。
35
+
36
+ ```JavaScript
37
+ 'use strict';
38
+ var words = ['sample', 'alert', 'community'],
39
+ input = '<a>abcabacaa,sample,aaaaa</a>'.replace(/^<[^>]*>|<[^>]*>$/g, '').split(','),
40
+ i = input.length;
41
+
42
+ while (i--) {
43
+ if (words.indexOf(input[i]) !== -1) {
44
+ // フラグ変数 match を使わず、ここでマッチした時の処理もやっておく
45
+ console.log(input[i]); // "sample"
46
+ break;
47
+ }
48
+ }
49
+ ```
50
+
51
+ **(2016/02/24 13:20追記) Array.prototype.indexOf のコードを追加しました。**
52
+
29
53
  Re: fagai さん

2

バグ修正

2016/02/24 04:21

投稿

think49
think49

スコア18194

answer CHANGED
@@ -7,7 +7,7 @@
7
7
  input = '<a>abcabacaa,sample,aaaaa</a>',
8
8
  i = words.length;
9
9
 
10
- input = input.replace(/^<[^>]*>|<[^>]*>$/g); // 余計な文字列は削っておく
10
+ input = input.replace(/^<[^>]*>|<[^>]*>$/g, ''); // 余計な文字列は削っておく
11
11
 
12
12
  while (i--) {
13
13
  if (input.indexOf(words[i]) !== -1) {

1

input の余計な文字列削除処理を追加

2016/02/24 04:05

投稿

think49
think49

スコア18194

answer CHANGED
@@ -7,6 +7,8 @@
7
7
  input = '<a>abcabacaa,sample,aaaaa</a>',
8
8
  i = words.length;
9
9
 
10
+ input = input.replace(/^<[^>]*>|<[^>]*>$/g); // 余計な文字列は削っておく
11
+
10
12
  while (i--) {
11
13
  if (input.indexOf(words[i]) !== -1) {
12
14
  // フラグ変数 match を使わず、ここでマッチした時の処理もやっておく