JavaScript | 配列・オブジェクト:配列の変換・加工 – reverse

JavaScript JavaScript
スポンサーリンク

reverse とは何か

reverse は「配列の要素の並びを“逆順”に並べ替える」メソッドです。ここが重要です:reverse は“破壊的(インプレース)”に働き、元の配列そのものを逆順に書き換えます。戻り値は“同じ配列への参照”です。


基本の使い方と破壊的挙動

配列を逆順にする

const a = [1, 2, 3];
const r = a.reverse();

console.log(r); // [3, 2, 1]
console.log(a); // [3, 2, 1](元も変わる)
console.log(r === a); // true(同じ参照)
JavaScript

ここが重要です:元配列を書き換えるため、他所で共有していると意図せぬ影響が出ます。共有状態では“非破壊”の手段を取りましょう。

非破壊で逆順にしたいとき

const a = [1, 2, 3];
const reversed = [...a].reverse(); // まずコピーしてから reverse
console.log(a);        // [1, 2, 3](元はそのまま)
console.log(reversed); // [3, 2, 1]
JavaScript

ここが重要です:スプレッド(または slice)で“浅いコピー”を作ってから reverse すれば、安全に逆順を得られます。


よく使うパターン(時系列・末尾基準の操作)

時系列の最新から表示

const logs = ["10:00 起動", "10:05 読み込み", "10:10 完了"];
const newestFirst = [...logs].reverse();
// UI表示を最新→過去にしたいときの定番
JavaScript

末尾 N 件の逆順取得

const xs = [1,2,3,4,5,6];
const last3NewestFirst = xs.slice(-3).reverse(); // [6,5,4]
JavaScript

ここが重要です:slice(-N) で“末尾 N 件”を取り、reverse で“新しい順”に並べると直感的です。

逆順ループ(for…of)

for (const x of [...xs].reverse()) {
  // 逆順で処理(元を守る)
}
JavaScript

挙動の細かいポイント(疎配列・要素型)

疎配列(空スロット)の扱い

const a = [1, , 3]; // 真ん中は“空スロット”
a.reverse();
console.log(a); // [3, , 1](穴も“位置ごと”反転)
JavaScript

ここが重要です:空スロットは“存在しない要素”として位置だけ反転します。穴が気になるなら、先に Array.from などで正規化して扱うのが安全です。

オブジェクト要素は参照がそのまま移動

const users = [{id:1},{id:2}];
const r = [...users].reverse();
r[0].id = 999; // オブジェクト参照は共有
console.log(users[1].id); // 999
JavaScript

ここが重要です:reverse は“順序”を変えるだけ。要素のオブジェクトは同じ参照です。編集するなら要素のコピー({…obj})を使います。

型付き配列(TypedArray)でも reverse 可能

const a = new Uint8Array([1,2,3]);
a.reverse();
console.log(a); // Uint8Array [3,2,1]
JavaScript

文字列を逆順にしたいときの注意

基本的な文字列の反転

const s = "abc";
const rev = s.split("").reverse().join(""); // "cba"
JavaScript

ここが重要です:文字列は配列ではないため、split→reverse→join の手順になります。

絵文字・結合文字を正しく扱う(初級の安全策)

const s = "a😊́b"; // サロゲートペアや結合文字を含む可能性
const chars = Array.from(s);       // コードポイント単位で分解
const rev = chars.reverse().join("");
JavaScript

ここが重要です:Array.from は“コードポイント”で分解するため、単純な split(“”) より安全です。さらに厳密に“書記素(グラフェム)”単位で扱いたい場合は、表示要件に応じた専用処理が必要です。


パフォーマンスと設計の指針

  • 共有参照への配慮: 破壊的な reverse はバグ源になりがちです。共有される配列はコピーしてから reverse。
  • 必要な部分だけ逆順に: 全体を逆順にする代わりに、slice(-N).reverse のように“必要部分だけ”を対象にするとコストを抑えられます。
  • sort との違い: reverse は“現在の並びを反転”するだけ。条件順にしたいなら sort(非破壊で使うなら […arr].sort(…))。

実践例(UI・アルゴリズム)

チャットのメッセージを最新から

const messages = [
  { id: 1, text: "Hi" },
  { id: 2, text: "Hello" },
  { id: 3, text: "Yo" }
];
const display = [...messages].reverse(); // 最新→過去
JavaScript

スタックを“下から”処理したい

const stack = [1,2,3]; // 3 がトップ
for (const x of [...stack].reverse()) {
  // 1→2→3 の順で処理
}
JavaScript

履歴の巻き戻し

const history = ["state1","state2","state3"];
for (const st of [...history].reverse()) {
  // 巻き戻し処理
}
JavaScript

まとめ

reverse は「配列の順序を逆転する」メソッドで、破壊的に元配列を書き換えます。安全に使うための鍵は“コピーしてから reverse”という非破壊パターン、疎配列の穴は位置だけ反転する点、要素オブジェクトの参照がそのまま移動する点の理解です。文字列の反転は split→reverse→join ですが、結合文字を含む可能性があるなら Array.from を使うとより安全。必要部分だけ逆順にする設計や sort との使い分けを徹底すれば、初心者でも意図通りで壊れにくい逆順処理を書けます。

タイトルとURLをコピーしました