JavaScript Tips | 文字列ユーティリティ:生成 - 省略文字列

JavaScript JavaScript
スポンサーリンク

「省略文字列」で何をしたいのかをはっきりさせる

ここでの「省略文字列」は、長すぎる文字列を「…」などで途中カットして、画面に収まる形にするユーティリティのことです。

テーブルのカラム幅に収まらないタイトルを「…」で省略したい。
スマホ画面で、長い名前や説明文を1行・2行に収めたい。
ログや一覧では短く、詳細画面ではフルで見せたい。

つまり、「元の文字列はそのまま持っておきつつ、“表示用だけ短くした版”を生成する」のがゴールです。


一番基本の「末尾に … を付けて切る」ユーティリティ

シンプルな省略関数の形

まずは、「最大文字数を超えたら末尾を にして切る」という一番よくあるパターンからいきます。

function ellipsis(text, maxLength, suffix = "…") {
  if (text == null) return "";

  const s = String(text);

  if (s.length <= maxLength) {
    return s;
  }

  if (maxLength <= suffix.length) {
    // 省略記号の方が長い or 同じ長さなら、素直に切るだけ
    return s.slice(0, maxLength);
  }

  const visibleLength = maxLength - suffix.length;
  const head = s.slice(0, visibleLength);

  return head + suffix;
}
JavaScript

ここが重要ポイントです。

  • null / undefined は空文字にしておくと扱いやすい。
  • もともと短い文字列は、そのまま返す(省略しない)。
  • maxLength から suffix の長さを引いて、「本体として見せられる文字数」を計算する。
  • その分だけ先頭から切り出して、最後に suffix)を足す。

実際の動きはこうなります。

ellipsis("これはテストです", 10);        // "これはテス…"
ellipsis("短い", 10);                    // "短い"(そのまま)
ellipsis("Very long title here", 10);    // "Very lon…"
JavaScript

「とりあえず一覧に収めたい」という用途なら、まずこのレベルで十分です。


先頭を残して「…」を付けるパターン

「後ろの方が大事」なケース

ファイルパスやドメイン名など、「後ろの方が意味を持つ」文字列もあります。

例として、ファイルパスを考えます。

C:\Users\foo\projects\super-long-project-name\src\index.ts

これを単純に末尾を切ると、肝心のファイル名が見えなくなります。

そこで、「末尾を残して、先頭側を省略する」パターンが役に立ちます。

末尾を残して省略するユーティリティ

function ellipsisStart(text, maxLength, prefix = "…") {
  if (text == null) return "";

  const s = String(text);

  if (s.length <= maxLength) {
    return s;
  }

  if (maxLength <= prefix.length) {
    return s.slice(-maxLength);
  }

  const visibleLength = maxLength - prefix.length;
  const tail = s.slice(-visibleLength);

  return prefix + tail;
}
JavaScript

動きはこうなります。

ellipsisStart("C:\\Users\\foo\\projects\\super-long\\src\\index.ts", 20);
// 例: "…g\\src\\index.ts"

ellipsisStart("example-very-long-domain.com", 15);
// 例: "…g-domain.com"
JavaScript

「最後の部分が重要な文字列」を扱うときに、このパターンを覚えておくと便利です。


真ん中を省略する「前後を少しずつ残す」パターン

「前も後ろも少し見せたい」ケース

パスやIDなどで、「先頭と末尾は見せたいけど、真ん中は省略したい」こともあります。

例えば、長いIDをこう見せたいイメージです。

1234567890abcdef1234…cdef

中央省略ユーティリティ

function ellipsisMiddle(text, maxLength, marker = "…") {
  if (text == null) return "";

  const s = String(text);

  if (s.length <= maxLength) {
    return s;
  }

  if (maxLength <= marker.length + 2) {
    // 両端を1文字ずつ残す余裕がない場合は、素直に末尾省略にする
    return ellipsis(s, maxLength, marker);
  }

  const remain = maxLength - marker.length;
  const headLength = Math.ceil(remain / 2);
  const tailLength = Math.floor(remain / 2);

  const head = s.slice(0, headLength);
  const tail = s.slice(-tailLength);

  return head + marker + tail;
}
JavaScript

重要なポイントはここです。

  • maxLength から marker)の長さを引いて、「前後で分け合う文字数」を出す。
  • 前半は Math.ceil、後半は Math.floor で、合計がぴったり合うようにする。
  • 先頭から headLength 文字、末尾から tailLength 文字を取り出して、間に marker を挟む。

動きはこうなります。

ellipsisMiddle("1234567890abcdef", 10); // 例: "1234…cdef"
ellipsisMiddle("C:\\very\\long\\path\\to\\file.txt", 20);
// 例: "C:\\very…file.txt"
JavaScript

「前後の雰囲気は残したいけど、真ん中はどうでもいい」というときにちょうどいいです。


実務での使いどころと注意点

「省略はあくまで表示用」と割り切る

省略文字列は、必ず「表示用」だけに使うと決めておくのが大事です。

検索や比較、ID の一致判定などに、省略後の文字列を使ってはいけません。
あくまで「元のフルの値」を持っておき、
画面に出す直前だけ ellipsis 系の関数を通す、という構造にしておきます。

これを守らないと、

「省略された文字列同士を比較して、別のものを同じと判定してしまう」

といった事故につながります。

「何文字にするか」は画面ごとに決める

同じ文字列でも、表示する場所によって「ちょうどいい長さ」は変わります。

テーブルのカラム → 20〜30文字くらい
カード型UIのタイトル → 40〜50文字くらい
スマホの1行表示 → 10〜15文字くらい

なので、ユーティリティ側は「省略のロジック」だけを持ち、
「何文字にするか」は呼び出し側(画面側)で決めるのがきれいです。


ちょっとだけ手を動かしてみる

コンソールで、次のあたりを試してみてください。

ellipsis("これはとても長い説明文です。実際の画面では途中までしか見せたくないことがあります。", 20);
ellipsisStart("C:\\Users\\foo\\projects\\super-long-project-name\\src\\index.ts", 25);
ellipsisMiddle("1234567890abcdef", 10);
JavaScript

「どこが残って、どこが になるか」を目で確認してみてください。

そのうえで、自分のプロジェクトに

export function ellipsis(...) { ... }
export function ellipsisStart(...) { ... }
export function ellipsisMiddle(...) { ... }
JavaScript

の3本を置いて、

  • 通常の省略 → ellipsis
  • 後ろが大事な文字列 → ellipsisStart
  • 前後を少しずつ残したい → ellipsisMiddle

という使い分けをルール化してみてください。

それだけで、あなたの「省略処理」は
場当たり的な substr 連打から、
意図と見やすさを両立した「省略文字列ユーティリティ」に一段レベルアップします。

タイトルとURLをコピーしました