これでかなりハマった…

ちょっとタイトル的にわかりにくいので、初めに書いておくと…

  • 文字列 abcde がある
  • 配列array = ['ab','def','de'] がある

この場合に文字列abcdeの中に配列arrayの文字列のいずれかが含まれるかどうかを確認したいというものです。

先に結論


forEachsomeで確認することができます。

forEachの場合


forEachを使う場合はどうやらtry~catchを使わんといかんらしい。コードは下記のような感じ。
別の関数を作って、その中でグルグル回してます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function IsContain(s, array) {
array.forEach(function(val) {
try {
if (s.match(val)) {
throw BreakException;
}
} catch (e) {
return true;
}
return false;
});
}

var array = ['ab','def','de'];

if (IsContain('abcde', array) {
console.log('あった');
} else {
console.log('なかった');
}

私は普段JavaScriptとは無縁な人間なんですけど、これにはびっくりしたね。だってforEachの中でreturnしてもbreakしても全部の要素を処理するんですよ。アホかと思った。なんでこんなことするのに例外発生させないといけないのか。

someを使う場合


some使ったら一応、例外発生させなくてもできた。コードは下記のような感じ。

1
2
3
4
5
function IsContain(s, array) {
array.some(function(val) {
return s.match(val);
});
}

EJSで書く場合


今回はこのサイトでEJSテンプレートを使ってて、その中でやりたかったので、おまけで書いておく。

1
2
3
4
5
6
7
8
9
10
11
12
<%
function IsContain(s, array) {
array.some(function(val) {
return s.match(val);
});
}
%>

<% var array = ['ab','def','de']; %>
<% if (IsContain('abcde', array)) { %>
<% var result = 'あった'; %>
<% } %>

以上。
しっかし、EJSも慣れてないってのもあったんだけど、こんなしょうもないことで数時間使うとは思わなかった…