WEBVTT

1
00:00:00.000 --> 00:00:00.950
こんにちは。

2
00:00:00.950 --> 00:00:04.275
今回はラストインデックスオブを紹介します。

3
00:00:04.275 --> 00:00:09.025
これは、指定した文字列が最後に現れる位置を返すメソッドです。

4
00:00:09.025 --> 00:00:14.329
たとえば、チーム、サービス、ワーカーとコロンでつながった識別子から、最後の名前と、

5
00:00:14.329 --> 00:00:19.633
その前の所属部分を取り出したい場面を考えてください。

6
00:00:19.633 --> 00:00:26.283
区切り文字が何個あるか決まっていなくても、最後の区切りの位置が分かれば処理できます。

7
00:00:26.283 --> 00:00:32.458
単なる有無の確認に加えて、どこで分けるかという判断材料が得られるのが特長です。

8
00:00:32.458 --> 00:00:36.971
この動画では、引数と戻り値、識別子を分ける実践例、検索位置の指定、失敗しやすい条件まで、

9
00:00:36.971 --> 00:00:41.483
実行結果と一緒に学びます。

10
00:00:41.483 --> 00:00:47.500
配列にも同名のメソッドがありますが、この動画で扱うのは文字列のメソッドです。

11
00:00:47.500 --> 00:00:49.201
まず動作環境を確認します。

12
00:00:49.201 --> 00:00:57.311
エムディーエヌでは、このメソッドは広く利用可能な機能とされ、二千十五年七月以降のブラウザー間で利用できると説明されています。

13
00:00:57.311 --> 00:01:01.890
現在のクローム、エッジ、ファイアーフォックス、サファリで使用できます。

14
00:01:01.890 --> 00:01:05.618
ブラウザー専用のエーピーアイではなく、ジャバスクリプトの組み込みメソッドなので、

15
00:01:05.618 --> 00:01:09.346
ノード・ジェイエスでも動作します。

16
00:01:09.346 --> 00:01:15.756
この記事の実行対象はノード二十二以降ですが、二十二で新しく追加された機能という意味ではありません。

17
00:01:15.756 --> 00:01:21.512
追加パッケージや実験用フラグは不要で、実機でも関数として備わっていることを確認済みです。

18
00:01:21.512 --> 00:01:23.300
書き方を確認します。

19
00:01:23.300 --> 00:01:31.527
対象の文字列に続けてラストインデックスオブと書き、カッコの中に探したい部分文字列を渡します。

20
00:01:31.527 --> 00:01:37.250
これは正規表現のパターンではなく、文字列そのものを探す指定です。

21
00:01:37.250 --> 00:01:43.331
第二引数のポジションは省略可能で、一致の開始位置の上限を指定します。

22
00:01:43.331 --> 00:01:47.802
省略した場合は文字列全体から最後の一致を探します。

23
00:01:47.802 --> 00:01:54.061
戻り値は、見つかった部分文字列の開始位置を表す整数で、先頭はゼロです。

24
00:01:54.061 --> 00:01:57.459
見つからなければマイナス一を返します。

25
00:01:57.459 --> 00:02:00.500
検索は大文字と小文字を区別します。

26
00:02:00.500 --> 00:02:03.540
対象の文字列自体は変更されません。

27
00:02:03.540 --> 00:02:04.723
基本例を見ます。

28
00:02:04.723 --> 00:02:09.083
チーム、サービス、ワーカーをコロンでつないだ識別子について、コロンを探すと、

29
00:02:09.083 --> 00:02:13.444
最後のコロンの位置である十二が返りました。

30
00:02:13.444 --> 00:02:20.835
あとはスライスを使い、位置より前を切り出すと所属部分、位置の次から切り出すと最後の名前が得られます。

31
00:02:20.835 --> 00:02:23.200
実機でもこの結果を確認しました。

32
00:02:23.200 --> 00:02:29.704
区切りの個数が分からなくても、最後の一個だけを基準にできるのが、このメソッドの強みです。

33
00:02:29.704 --> 00:02:37.982
インデックスオブが最初の一致を返すのに対し、こちらは最後の一致を返す、という対比で覚えると分かりやすいでしょう。

34
00:02:37.982 --> 00:02:42.712
位置が分かれば、あとは切り出すだけという流れを意識してください。

35
00:02:42.712 --> 00:02:46.698
実践として、最後の区切りで分ける独自関数を作ります。

36
00:02:46.698 --> 00:02:52.677
まず対象と区切りが文字列かどうかを確認し、区切りが空文字列ならエラーにします。

37
00:02:52.677 --> 00:02:56.970
次にラストインデックスオブで位置を探し、マイナス一なら見つからなかったとして、

38
00:02:56.970 --> 00:03:01.262
元の文字列を後半に入れて返します。

39
00:03:01.262 --> 00:03:08.314
見つかった場合は、位置より前を前半、位置に区切りの長さを足した場所からを後半として返します。

40
00:03:08.314 --> 00:03:14.446
区切りが二文字以上でも、長さの分だけ進めるので、区切りの一部が後半に残りません。

41
00:03:14.446 --> 00:03:20.732
記事のサンプルで実行すると、期待出力どおりの結果になることを実機でも確認しました。

42
00:03:20.732 --> 00:03:22.478
境界ケースを確認します。

43
00:03:22.478 --> 00:03:29.026
区切りがない識別子では、ファウンドがフォルスになり、前半は空、後半に元の文字列が入ります。

44
00:03:29.026 --> 00:03:33.682
区切りが先頭にある場合は、見つかっているのに前半が空になります。

45
00:03:33.682 --> 00:03:40.375
この二つは前半だけ見ると区別できないため、ファウンドという項目で区別できるようにしています。

46
00:03:40.375 --> 00:03:43.576
区切りが末尾にある場合は後半が空になります。

47
00:03:43.576 --> 00:03:48.523
また、区切りがコロン二つのような複数文字でも、正しく分割できました。

48
00:03:48.523 --> 00:03:51.870
実機でもすべて記事の期待出力と一致しています。

49
00:03:51.870 --> 00:03:55.944
境界の結果を先に決めておくことが、実践コードの要点です。

50
00:03:55.944 --> 00:03:58.835
検索位置を指定する使い方を見ます。

51
00:03:58.835 --> 00:04:06.149
エーババという文字列では、エーバが位置ゼロと位置二の両方で始まり、重なって一致します。

52
00:04:06.149 --> 00:04:09.721
引数なしでは最後の一致である二が返ります。

53
00:04:09.721 --> 00:04:16.354
そこから一を引いた位置を上限に再検索すると、前の一致であるゼロが得られました。

54
00:04:16.354 --> 00:04:21.967
ここで重要なのは、第二引数は一致の開始位置の上限だということです。

55
00:04:21.967 --> 00:04:25.028
一致全体の末尾の上限ではありません。

56
00:04:25.028 --> 00:04:30.301
位置二を指定した検索でも、位置二で始まる一致は対象になります。

57
00:04:30.301 --> 00:04:37.444
負数を渡すとゼロとして扱われ、末尾から数える指定にはならない点にも注意してください。

58
00:04:37.444 --> 00:04:39.731
失敗しやすい書き方を取り上げます。

59
00:04:39.731 --> 00:04:42.824
戻り値をそのまま条件式に入れてしまうことです。

60
00:04:42.824 --> 00:04:47.532
位置ゼロで見つかった場合、その値はゼロなので偽と判定されてしまいます。

61
00:04:47.532 --> 00:04:52.375
逆に、見つからなかった場合のマイナス一は、数値としては真と判定されます。

62
00:04:52.375 --> 00:04:59.235
つまり、見つかったのに処理されず、見つからないのに処理されるという、まったく逆の結果になりかねません。

63
00:04:59.235 --> 00:05:06.095
検索結果はいったん変数に保存し、見つかったかどうかはマイナス一ではないことと比較して判定してください。

64
00:05:06.095 --> 00:05:11.072
記事の実践コードで明示的に比較しているのは、この取り違えを避けるためです。

65
00:05:11.072 --> 00:05:13.904
空文字列と引数の省略にも注意します。

66
00:05:13.904 --> 00:05:22.242
空文字列を探すと、通常の区切り検索とは違う結果になり、たとえばエービーシーで探すと長さと同じ三が返ります。

67
00:05:22.242 --> 00:05:28.062
区切りとして意味が曖昧になるため、記事の実践コードでは独自に禁止しました。

68
00:05:28.062 --> 00:05:37.029
もう一つ、検索語を省略したりアンディファインドを渡したりすると、文字列のアンディファインドが検索されてしまいます。

69
00:05:37.029 --> 00:05:43.794
エーピーアイから受け取った値などは、意図した文字列かどうかを確認してから渡しましょう。

70
00:05:43.794 --> 00:05:50.244
実践コードの型チェックは、こうした暗黙の変換による見落としを減らすためのものです。

71
00:05:50.244 --> 00:05:52.725
位置の数え方についても確認します。

72
00:05:52.725 --> 00:05:58.270
ジャバスクリプトの文字列の添字は、ユーティーエフ十六のコード単位で数えます。

73
00:05:58.270 --> 00:06:04.690
絵文字は見た目では一文字でも二単位を使うため、絵文字の直後のコロンの位置は二になります。

74
00:06:04.690 --> 00:06:06.587
実機でも二を確認しました。

75
00:06:06.587 --> 00:06:16.072
取得した位置を同じ文字列のスライスへ渡す用途には適していますが、画面上の何文字目かという案内へそのまま転用するのは避けてください。

76
00:06:16.072 --> 00:06:19.866
また、このメソッドは同期処理でプロミスは返しません。

77
00:06:19.866 --> 00:06:27.016
引用符で囲まれた範囲などを理解するものでもないため、構文規則のあるデータ全体の解析には向きません。

78
00:06:27.016 --> 00:06:28.028
まとめです。

79
00:06:28.028 --> 00:06:36.464
ラストインデックスオブは、指定した文字列が最後に現れる開始位置を返し、なければマイナス一を返します。

80
00:06:36.464 --> 00:06:38.152
ポイントは三つです。

81
00:06:38.152 --> 00:06:43.045
まず、第二引数は開始位置の上限で、重なる一致も探せること。

82
00:06:43.045 --> 00:06:49.287
次に、判定はマイナス一との比較で明示し、戻り値を条件式に直接入れないこと。

83
00:06:49.287 --> 00:06:56.711
そして、空文字列の検索やユーティーエフ十六単位の位置など、境界の仕様を押さえることです。

84
00:06:56.711 --> 00:07:06.328
活用場面では、区切り規則を自分たちで決めた識別子に絞り、区切りなしを許すかなどの入力規則を先に決めるのがコツです。

85
00:07:06.328 --> 00:07:12.065
まずは記事の実践例を実行し、結果を予測してから確かめてみてください。

86
00:07:12.065 --> 00:07:13.583
お疲れさまでした。

87
00:07:13.583 --> 00:07:18.476
検索の道具として素直に使える範囲を見極めることが大切です。
