JavaScriptで文字列の先頭文字に基づいて配列をフィルタリングする方法
はじめに
次のような、人名を格納した配列があるとします。
const arr = ['Amy','Dolly','Jason','Madison','Patricia'];
ここで必要なのは、このような配列を第1引数として受け取り、さらに小文字のアルファベット2文字を第2引数・第3引数として受け取るJavaScript関数です。この関数は、第2引数と第3引数で指定された範囲内のアルファベットで始まる要素だけを残すよう、配列をフィルタリングします。
たとえば、第2引数と第3引数がそれぞれ「a」と「j」だった場合、出力結果は次のようになります。
const output = ['Amy','Dolly','Jason'];
コード例
実際にコードを書いてみましょう。
const arr = ['Amy','Dolly','Jason','Madison','Patricia'];
const filterByAlphaRange = (arr = [], start = 'a', end = 'z') => {
const isGreater = (c1, c2) => c1 >= c2;
const isSmaller = (c1, c2) => c1 <= c2;
const filtered = arr.filter(el => {
const [firstChar] = el.toLowerCase();
return isGreater(firstChar, start) && isSmaller(firstChar, end);
});
return filtered;
};
console.log(filterByAlphaRange(arr, 'a', 'j'));出力結果
コンソールには次のように表示されます。
[ 'Amy', 'Dolly', 'Jason' ]
コードの解説
この関数の仕組みを簡単に説明します。まず el.toLowerCase() で各文字列を小文字に変換し、分割代入(デストラクチャリング)を使って先頭の1文字だけを取り出しています。
次に、補助関数 isGreater と isSmaller を使って、その先頭文字が指定範囲(start 以上・end 以下)に収まっているかどうかを判定します。JavaScriptでは文字同士もUnicodeのコードポイント順に比較できるため、アルファベット順の範囲チェックを比較演算子だけでシンプルに実装できます。
最後に Array.prototype.filter() が条件を満たす要素だけを集め、新しい配列として返します。元の配列は変更されないため、安全に使える点もメリットです。
-
JavaScriptで配列内の唯一の異なる文字列を見つける方法
問題 文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。 例: 次のような配列が与えられたとします。 [ba, abc, acb, bac, foo, bca, cab, cba] この場合、求めるべき文字列は「foo」です。 文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と
-
JavaScriptで文字列内のアルファベットだけを反転する方法
問題の概要JavaScriptで、アルファベットといくつかの特殊文字(記号)が混在する文字列 str を受け取る関数を作成することを求められています。この関数は、入力文字列をもとに新しい文字列を返します。その際のルールは次のとおりです。アルファベット以外の文字(記号・数字など)は、元の位置にそのまま留まります。アルファベットの文字だけが、互いに反転した位置へ移動します。入力例と出力例たとえば、関数への入力が以下だった場合を考えてみましょう。入力const str = k_lmn_opq;出力const output = q_pon_mlk;「_」という記号は位置が変わっておらず、アルファベット