4

初心者はこちら!

最近、問題に遭遇しました。基本的に、プログラムは、並べ替え関数を実際に使用せずに、フィールドの 1 つでオブジェクトの配列を並べ替える必要があります。バブルソートアルゴリズムを使用してこのコードを試しましたが、機能していないようです:

var arrayOfPeople = [
    {name: "Rick", age: 30, place: 2},
    {name: "Alan", age: 25, place: 1},
    {name: "Joe", age: 40, place: 4},
    {name: "Dave", age: 35, place: 3}
];


function bubbleSort(a,par)
{
    var swapped;

    do {
        swapped = false;

        for (var i = 0; i < a.length - 1; i++) {
            if (a[i].par > a[i + 1].par) {
                var temp = a[i];

                a[i] = a[i + 1];
                a[i + 1] = temp;

                swapped = true;
            }
        }
    } while (swapped);
}


bubbleSort(arrayOfPeople,'age');

for (i = 0; i < arrayOfPeople.length; i++) {
    console.log(arrayOfPeople[i]);
}

私の推測では、構文的に間違ったことをしていると思います。フィードバックをいただければ幸いです。

4

2 に答える 2

8

唯一の問題は、「par」引数を正しく使用していなかったことです。構文は常に「prop」という名前のobj.propプロパティを検索しようとするため、動的にするには、「prop」の代わりに変数を取得できる obj["prop"] などの角括弧を使用する必要があります。

エラーは発生せずa[i].par、両方ともそれ自体と比較できるundefineda[i+1].parを返しました。(したがって、常に false を返します)a[i].par > a[i+1].par

動作する改訂されたコードは次のとおりです。

function bubbleSort(a, par)
{
    var swapped;
    do {
        swapped = false;
        for (var i = 0; i < a.length - 1; i++) {
            if (a[i][par] > a[i + 1][par]) {
                var temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
                swapped = true;
            }
        }
    } while (swapped);
}


bubbleSort(arrayOfPeople, 'age');

for (i = 0; i < arrayOfPeople.length; i++) {
   console.log(arrayOfPeople[i]);
}

ライブ テスト ケース

このコンテキストで言及する価値があるのは、実際のオブジェクト (この場合は配列) を変更する関数は些細なことではないということです。値渡しと参照渡しの詳細については、次の優れた質問をご覧ください: Is JavaScript a pass-by-reference or pass-by-value language?

于 2013-06-06T08:03:52.613 に答える
4

組み込みの配列ソート関数を使用します。

arrayOfPeople.sort(function(a,b) {return a.age-b.age;});
于 2014-01-18T21:59:17.377 に答える