JavaScriptの配列から最も長い文字列をすべて検索・取得する方法
以下のような文字列の配列があったとしましょう。
const arr = [ 'iLoveProgramming', 'thisisalsoastrig', 'Javascriptisfun', 'helloworld', 'canIBeTheLongest', 'Laststring' ];
このような配列を受け取って、最も長い文字列をすべて取り出すJavaScript関数を作成します。最長の文字列が複数存在する場合も、漏れなくすべて取得できるのがポイントです。
関数は最終的に、最長の文字列だけを要素として含む新しい配列を返します。
コード例
reduceメソッドを使った実装は次のとおりです。
const arr = [
'iLoveProgramming',
'thisisalsoastrig',
'Javascriptisfun',
'helloworld',
'canIBeTheLongest',
'Laststring'
];
const getLongestStrings = (arr = []) => {
return arr.reduce((acc, val, ind) => {
if (!ind || acc[0].length < val.length) {
return [val];
}
if (acc[0].length === val.length) {
acc.push(val);
}
return acc;
}, []);
};
console.log(getLongestStrings(arr));実行結果
コンソールには次のように表示されます。
[ 'iLoveProgramming', 'thisisalsoastrig', 'canIBeTheLongest' ]
処理の流れを解説
このコードでは、Array.prototype.reduce を使って配列を1つの配列へと畳み込んでいます。具体的な処理の流れは以下のとおりです。
- アキュムレータ(acc)には、「これまでに見つかった最長の文字列」を順に格納していきます。
- 先頭の要素(ind が 0)のとき、または現在の値 val が acc[0] より長い場合は、新しい配列 [val] を返して最長記録を更新します。
- val の長さが acc[0] と同じ場合は、同率の最長として acc に追加します。
- それ以外の場合は acc をそのまま返し、次の要素の判定へ進みます。
この仕組みにより、配列を1回走査するだけで、同率を含むすべての最長文字列を収集できます。
別のアプローチ:filterとMath.maxを組み合わせる
より直感的なコードにしたい場合は、map・Math.max・filter を組み合わせる方法もおすすめです。
const getLongestStrings = (arr = []) => {
const maxLength = Math.max(...arr.map(str => str.length));
return arr.filter(str => str.length === maxLength);
};まず map で各文字列の長さの一覧を作成し、Math.max でその最大値を求めます。続いて filter で最大長と一致する文字列だけを抽出すれば完成です。コードの意図が読み取りやすいため、チーム開発などではこちらの書き方が好まれることも少なくありません。
どちらの方法でも得られる結果は同じです。配列の規模やコードの可読性といった要件に応じて、用途に合った方を選択してください。
-
JavaScriptで配列内の文字列から連続する重複文字を削除する方法
問題 JavaScriptで、文字列の配列を引数として受け取る関数を作成することを考えます。この関数は、各文字列の中で連続して出現する重複した文字を削除し、処理後の新しい文字列の配列を返す必要があります。 たとえば「kelless」という文字列には「ll」や「ss」のように同じ文字が続く部分があるため、それぞれ1文字にまとめて「keles」に変換するイメージです。 解決策の例 以下は実際のコードです − { if (arr[index] !== arr[index+1]) { map.push(arr[index]);
-
JavaScriptで昇順配列の中から並び順を壊している唯一の要素を見つける方法
この記事では、昇順(増加順)にソートされた数値の配列の中に、ただひとつだけ並び順を乱している要素がある場合に、その要素を特定して返すJavaScript関数の実装方法を解説します。 問題の定義 扱う配列は基本的に昇順でソートされていますが、その中の要素がひとつだけ順序から外れています。関数の目的は、その「異常な要素」を見つけ出して返すことです。 たとえば、次のような配列を考えます。 const arr = [1, 2, 3, 4, 17, 5, 6, 7, 8]; この配列から「17」を取り除けば残りは完全な昇順になるため、求める答えは「17」です。 解決のアプローチ 昇順の配列では、隣り合う