JavaScriptで特定の単語を優先的に先頭へ、残りをアルファベット順に並べ替える方法
ここでは、文字列を要素とする2つの配列を扱います。一方の配列をアルファベット順にソートする必要がありますが、その配列がもう一方の配列に含まれる単語を持っている場合、それらの単語は必ず先頭に配置し、それ以外の要素だけをアルファベット順に並べ替えるという要件を考えてみましょう。
この処理を実現するために、excludeSort(arr, ex) という関数を作成します。引数 arr はソート対象の配列、ex は arr 内に存在する場合に先頭へ移動させるべき文字列の配列です。
実装例
const arr = ['apple', 'cat', 'zebra', 'umbrella', 'disco', 'ball',
'lemon', 'kite', 'jack', 'nathan'];
const toBeExcluded = ['disco', 'zebra', 'umbrella', 'nathan'];
const excludeSort = (arr, ex) => {
arr.sort((a, b) => {
if (ex.includes(a)) {
return -1;
} else if (ex.includes(b)) {
return 1;
}
return a > b ? 1 : -1;
});
};
excludeSort(arr, toBeExcluded);
console.log(arr);
仕組みの解説
Array.prototype.sort() メソッドには比較関数(コンパレータ)を渡すことができます。この比較関数の中で以下の判定を行っています。
- 比較対象
aが除外リストexに含まれていれば-1を返し、aを前に移動させます。 - 逆に
bが除外リストに含まれていれば1を返し、bを前に移動させます。 - どちらも除外リストに含まれない通常の要素同士であれば、
a > b ? 1 : -1の条件式によって標準的なアルファベット順の比較を行います。
なお、より厳密な実装では両方の要素が除外リストに含まれるケースや同一の値の場合(0 を返すケース)も考慮すると、ソートの安定性が向上します。
出力結果
コンソールには次のように出力されます。
[ 'nathan', 'disco', 'umbrella', 'zebra', 'apple', 'ball', 'cat', 'jack', 'kite', 'lemon' ]
ご覧のとおり、nathan・disco・umbrella・zebra の4つの単語が先頭にまとめられ、それ以外の要素は apple から lemon まで正しくアルファベット順に並んでいます。このテクニックを使えば、「優先表示したい項目」を含む柔軟なカスタムソートを簡単に実装できます。
-
JavaScriptで配列からn個の最小値を元の順序のまま取得する方法
問題数値の配列 arr と整数 n を引数として受け取るJavaScript関数を作成する必要があります。この関数は、配列 arr から n 個の最小値を取り出しますが、重要なのは「元の配列における相対的な順序を崩してはいけない」という点です。つまり、結果を昇順や降順に並べ替えるのではなく、元の配列で出現した順番どおりに返す必要があります。解決策のコード例以下はその実装例です。const arr = [6, 3, 4, 1, 2];const num = 3;const smallestInOrder = (arr = [], num) => { &nb
-
JavaScriptで文字列の配列からコメントを削除する方法
この記事では、JavaScriptを使って文字列の配列からコメント部分を削除する方法について解説します。 問題 文字列の配列 arr を第一引数として、特殊文字の配列 starters を第二引数として受け取るJavaScript関数を作成する必要があります。 starters 配列には、コメントの開始となり得る文字が格納されています。作成する関数は、配列 arr を走査し、各文字列に含まれるコメントをすべて削除した結果を返すものとします。 例えば、関数への入力が次のような場合を考えてみましょう。 const arr = [ red, green !blue