JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptのバブルソートで配列内のオブジェクトを並べ替える方法

バブルソートとは?

バブルソート(Bubble Sort)は、隣り合う要素同士を順番に比較し、順序が正しくなければ入れ替えるという操作を繰り返す、最も基本的なソートアルゴリズムの一つです。大きい値が泡のように配列の末尾へ浮かんでいく様子から、この名前が付けられました。

本記事では、このバブルソートを使って、オブジェクトが格納された配列を特定のプロパティ(価格)を基準に並べ替える具体的な方法を解説します。

準備:Shoeクラスとオブジェクト配列の作成

まず、次のようなShoe(靴)オブジェクトを生成するためのコンストラクタクラスを定義します。

class Shoe {
    constructor(name, price, type) {
        this.name = name;
        this.price = price;
        this.type = type;
    }
};

続いて、このクラスを使って複数の靴オブジェクトを作成し、1つの配列に格納します。

const arr = [
    new Shoe('Nike AirMax 90', '120', 'Casual'),
    new Shoe('Jordan Retro 1', '110', 'Casual'),
    new Shoe('Jadon Doc Martens', '250', 'Seasonal boots'),
    new Shoe('Adidas X Ghosted', '110', 'Athletic'),
    new Shoe('Nike Vapourmax Flyknit', '250', 'Casual'),
    new Shoe('Aldo Loafers', '130', 'Formal'),
    new Shoe('Timberlands', '199', 'Seasonal boots'),
    new Shoe('Converse High Tops', '70', 'Casual'),
    new Shoe('Converse Low Tops', '80', 'Casual'),
    new Shoe('Adidas NMDs', '110', 'Athletic'),
    new Shoe('Heels', '130', 'Formal'),
    new Shoe('Nike AirForce', '150', 'Casual')
];

課題:priceプロパティを基準に並べ替える

今回の課題は、このオブジェクト配列を各オブジェクトのprice(価格)プロパティを基準に昇順で並べ替えるJavaScript関数を実装することです。Array.prototype.sort()などの組み込みメソッドには頼らず、バブルソートのアルゴリズムそのものを正確に使って並べ替えを行います。

バブルソートの実装例

const bubbleSort = (arr = []) => {
    let swapped;
    do {
        swapped = false;
        for (let i = 0; i < arr.length - 1; i++) {
            if (+arr[i].price > +arr[i + 1].price) {
                let temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                swapped = true;
            };
        };
    } while (swapped);
}

bubbleSort(arr);
console.log(arr);

コードのポイント

  • 数値への変換: priceは文字列として定義されているため、単項プラス演算子(+)を使って数値に変換してから比較しています。これにより、文字列同士の比較による意図しない結果を防げます。
  • 一時変数による交換: temp変数を経由することで、隣接する2つのオブジェクトを安全に入れ替えています。
  • swappedフラグによる最適化: 1回の走査で一度も入れ替えが発生しなければ、すでにソート済みと判断してdo...whileループを抜けます。これにより不要な繰り返し処理を削減できます。

出力結果

このコードを実行すると、コンソールには以下のように、価格の安い順(昇順)に並べ替えられた配列が出力されます。

[
    Shoe { name: 'Converse High Tops', price: '70', type: 'Casual' },
    Shoe { name: 'Converse Low Tops', price: '80', type: 'Casual' },
    Shoe { name: 'Jordan Retro 1', price: '110', type: 'Casual' },
    Shoe { name: 'Adidas X Ghosted', price: '110', type: 'Athletic' },
    Shoe { name: 'Adidas NMDs', price: '110', type: 'Athletic' },
    Shoe { name: 'Nike AirMax 90', price: '120', type: 'Casual' },
    Shoe { name: 'Aldo Loafers', price: '130', type: 'Formal' },
    Shoe { name: 'Heels', price: '130', type: 'Formal' },
    Shoe { name: 'Nike AirForce', price: '150', type: 'Casual' },
    Shoe { name: 'Timberlands', price: '199', type: 'Seasonal boots' },
    Shoe { name: 'Jadon Doc Martens', price: '250', type: 'Seasonal boots' },
    Shoe { name: 'Nike Vapourmax Flyknit', price: '250', type: 'Casual' }
]

まとめ

バブルソートは計算量がO(n²)と効率面では決して優秀ではありませんが、仕組みがシンプルで理解しやすいのが魅力です。今回のように比較条件を工夫すれば、任意のプロパティを基準にオブジェクト配列を柔軟に並べ替えることができます。アルゴリズムの学習や小規模データの処理に、ぜひ活用してみてください。

  1. JavaScriptのlengthプロパティで配列オブジェクトの長さを取得する方法

    JavaScriptにおけるlengthプロパティとはJavaScriptのlengthプロパティは、文字列や配列などのオブジェクトが持つ要素数(サイズ)を返すために使用されます。配列の場合は格納されている要素の個数、文字列の場合は文字数を取得できます。ここでは、文字列と配列オブジェクトの長さをlengthプロパティで取得するサンプルコードを紹介します。サンプルコード以下の例では、ボタンをクリックすると配列の長さが画面に表示される仕組みを実装しています。<!DOCTYPE html> <html lang="ja"> <head> <

  2. JavaScriptのArray.prototype.sort()メソッドの使い方をサンプルコードで解説

    Array.prototype.sort()は、JavaScriptで配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並び方に加えて、昇順・降順も自由に指定でき、配列操作の中でも特に使用頻度の高いメソッドの一つです。 ただし重要なポイントとして、sort()メソッドはデフォルトではすべての要素を文字列に変換してから比較します。そのため、数値の配列を意図したとおりに並べ替えたい場合は、比較関数を引数として渡す必要があります。 以下は、Array.prototype.sort()メソッドの基本的な使い方を示すサンプルコードです。 サンプルコード <!DOC