JavaScriptで別の配列を基準に配列を並べ替える方法
たとえば、次のような2つの配列があるとします。
const input = ['S-1','S-2','S-3','S-4','S-5','S-6','S-7','S-8']; const sortingArray = ["S-1", "S-5", "S-2", "S-6", "S-3", "S-7", "S-4", "S-8"];
このように「並べ替えたい配列」と「基準となる順序を持った配列」が別々に存在するケースは、実際の開発でもよくあります。
そこで今回は、1つ目の配列の要素を、2つ目の配列内での位置(インデックス)に従って並べ替えるJavaScript関数を作成してみましょう。
具体的には、2つの配列を第1引数・第2引数として受け取り、1つ目の配列を2つ目の配列の順序どおりにソートする関数を実装します。
実装例
const input = ['S-1','S-2','S-3','S-4','S-5','S-6','S-7','S-8'];
const sortingArray = ["S-1", "S-5", "S-2", "S-6", "S-3", "S-7", "S-4", "S-8"];
const sortByReference = (arr1 = [], arr2 = []) => {
const sorter = (a, b) => {
const firstIndex = arr2.indexOf(a);
const secondIndex = arr2.indexOf(b);
return firstIndex - secondIndex;
};
arr1.sort(sorter);
};
sortByReference(input, sortingArray);
console.log(input);
出力結果
コンソールには次のように出力されます。
[ 'S-1', 'S-5', 'S-2', 'S-6', 'S-3', 'S-7', 'S-4', 'S-8' ]
コードの解説
この実装のポイントは、sort()メソッドに渡している比較関数(sorter)です。
arr2.indexOf(a)で、要素aが基準配列内のどこに位置するかを取得します。- 同様に
bのインデックスも取得し、その差を返します。 - 差が負なら
aが先、正ならbが先に来るため、結果として1つ目の配列全体が2つ目の配列の順序に沿って並び替えられます。
より高速な代替案:Mapを活用する
indexOf() は呼び出しごとに先頭から線形探索を行うため、配列の要素数が多い場合は処理が遅くなる可能性があります。そのような場合、あらかじめ基準配列の「値 → インデックス」の対応を Map にキャッシュしておくと、参照がO(1)になり大幅に効率化できます。
const sortByReferenceFast = (arr1 = [], arr2 = []) => {
// 値とインデックスの対応表を一度だけ作成
const orderMap = new Map(arr2.map((value, index) => [value, index]));
arr1.sort((a, b) => orderMap.get(a) - orderMap.get(b));
};
sortByReferenceFast(input, sortingArray);
console.log(input); // 同じ結果が出力される
小規模なデータでは前者のシンプルな実装で十分ですが、数千件以上の要素を扱う場合は後者の Map 版を選ぶとよいでしょう。状況に応じて使い分けてください。
-
JavaScriptで配列の値に基づいて文字列の文字をシフトする方法
本記事では、小文字の英字のみで構成された文字列に対して、配列内の数値に従って各文字をシフトするJavaScript関数の実装方法を解説します。 問題の概要 まず、「1単位のシフト」を次のように定義します。ある文字を、アルファベット順でその直後の文字に置き換えること。これには循環(ラップアラウント)も含まれます。つまり、「z」の次の文字は「a」となります。 今回作成する関数は、以下の2つの引数を受け取ります。 str: 小文字英字のみを含む文字列(第1引数) arr: strと同じ長さを持つ数値の配列(第2引数) 関数は、元の文字列の各文字を、配列arr内の同じ位置にある数値の分だけ
-
JavaScriptで配列を出現頻度の昇順に並べ替える方法
問題数値の配列 arr を唯一の引数として受け取るJavaScript関数を作成する必要があります。配列 arr には重複した要素が含まれている可能性があります。この関数では、出現回数が少ない要素から順に配列を並べ替えます。つまり、出現頻度の低い要素を先頭に配置し、頻度の昇順に沿って残りの要素を並べていきます。なお、出現回数が同じ要素が複数存在する場合は、それらを値の昇順(小さい順)に配置する必要があります。入力例const arr = [5, 4, 5, 4, 2, 1, 12];出力例[1, 2, 12, 4, 4, 5, 5]出力の解説数値「1」「2」「12」はそれぞれ1回しか出現しない