JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで文章内の単語を文字数順に並べ替える方法

本記事では、文章(センテンス)を引数として受け取り、含まれる単語を文字数の少ない順に並べ替えるJavaScript関数の実装方法を詳しく解説します。

問題の概要

ここで扱う「文章」とは、半角スペースで区切られた複数の単語からなる文字列のことです。作成する関数は、この文章を第一引数(唯一の引数)として受け取ります。

求められる処理は、最も文字数が少ない単語を先頭に配置し、以降は文字数が大きい順に並べ替えるというものです。同一文字数の単語が存在する場合は、元の文章での出現順序を維持する必要があります。

入出力の例

例えば、入力が次の文字列だったとします。

const str = 'this is a string';

この場合、期待される出力は以下の通りです。

const output = 'a is this string';

各単語の文字数は「this」が4文字、「is」が2文字、「a」が1文字、「string」が6文字です。最も短い「a」が先頭になり、以降は文字数の昇順に並んでいるのが分かります。

コード例

実際の実装コードは以下のようになります。

const str = 'this is a string';
const arrangeWords = (str = []) => {
    const data = str.toLowerCase().split(' ').map((val, i)=> {
        return {
            str: val,
            length: val.length,
            index: i
        }
    })
    data.sort((a,b) => {
        if (a.length === b.length)
            return (a.index - b.index)
        return (a.length - b.length)
    });
    let res = '';
    let i = 0;
    while (i < data.length - 1)
        res += (data[i++].str + ' ');
    res += data[i].str;
    return (res)
};
console.log(arrangeWords(str));

コードの解説

① 前処理とデータ構造の構築

toLowerCase()ですべての文字を小文字に揃えた後、split(' ')で単語ごとに分割します。map()を使って、各単語について「単語本体(str)」「文字数(length)」「元の位置(index)」をまとめたオブジェクトの配列を作成しています。

② ソート処理

sort()の比較関数では、まず文字数を比較して昇順に並べます。文字数が等しい場合はindex(元の文章での出現順)で比較することで、同文字数の単語の順序が入れ替わらない安定した並べ替えを実現しています。なお、ES2019以降の仕様ではsort()自体が安定ソートであるため、最新の環境ではindexによる比較は省略可能ですが、古い実行環境との互換性を考慮すると明示しておくのが安全です。

③ 結果文字列の組み立て

whileループで最後の単語以外にスペースを付けながら連結し、末尾の単語はスペースなしで追加することで、余計な空白を含まないきれいな結果文字列を生成しています。

実行結果

上記コードをコンソールで実行すると、次の出力が得られます。

a is this string

このように、map()で単語情報を整理し、sort()で条件付きソートを行うことで、シンプルかつ堅牢な単語並べ替え関数を実装できます。大文字小文字の正規化や安定ソートへの配慮など、実務でも応用できるテクニックが詰まった良い例題です。

  1. JavaScriptの配列lengthプロパティとは?使い方とサンプルコードを解説

    JavaScriptのlengthプロパティは、配列に格納されている要素の総数(配列の長さ)を取得したり、設定したりできる便利なプロパティです。配列操作において最もよく使われるプロパティの一つであり、ループ処理や条件分岐など、さまざまな場面で活用されます。 lengthプロパティの基本 lengthプロパティは、以下のような特徴を持っています。 配列内の要素数を数値として返す 値を代入することで配列の長さを変更できる(短くすると要素が削除される) インデックスは0から始まるため、最後の要素のインデックスは「length - 1」になる サンプルコード 以下は、lengthプロパティを使って

  2. JavaScriptのlengthプロパティで配列オブジェクトの長さを取得する方法

    JavaScriptにおけるlengthプロパティとはJavaScriptのlengthプロパティは、文字列や配列などのオブジェクトが持つ要素数(サイズ)を返すために使用されます。配列の場合は格納されている要素の個数、文字列の場合は文字数を取得できます。ここでは、文字列と配列オブジェクトの長さをlengthプロパティで取得するサンプルコードを紹介します。サンプルコード以下の例では、ボタンをクリックすると配列の長さが画面に表示される仕組みを実装しています。<!DOCTYPE html> <html lang="ja"> <head> <