Arayの並べ替えの詳細

3028 ワード

並べ替えの必要性:
データセットを手に入れたら、おそらくArayタイプで保存されます.私たちは使用中、データ内の要素を並べ替える必要があります.ページに必要な順序を表示させたり、必要な順序にデータを並べさせたりします.
並べ替え方法:
1. reverse()
2. sort()
逆転()
説明:この関数は配列の順序を反転します.
var values = [1, 2, 3, 4, 5];
values.reverse();
alert(values); //[5,4,3,2,1]
sort()
説明:この関数はデフォルトの昇順で配列されています.つまり最小値は前にあり、最大値は後にあります.並べ替えロジックプロセス:並べ替えを実現するために、sort() メソッドは、各配列項目のtoString()を呼び出します. 変換方法は、次に得られた文字列を比較して、どのように並べ替えられているかを決定します.配列の各項目が数値であっても、sort() 方法の比較も文字列です.
var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); //[0,1,10,15,5]
10は5の前に位置していますが、並べ替えの時は文字列で並べ替えられていますので、ASCII文字順に元素を並べ替えます.文字列を比較する時は順番に大きさを比較します.(もちろん、これは私たちが欲しいものではない)
sort()はパラメータを持ってもいいです.パラメータは関数です.このパラメータは比較関数です.
比較関数は2つのパラメータを受信し、最初のパラメータが2番目の前にあるべきなら負の値を返し、2つのパラメータが等しいなら0を返し、最初のパラメータが2番目の後にあるべきなら正の値を返します.以下は簡単な比較関数です.
function compare(value1, value2) {
    if (value1 < value2) {
        return -1;
    } else if (value1 > value2) {
        return 1;
    } else {
        return 0;
    }
}
これで所期の結果が見られます.
var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); //[0,1,5,10,15]
ソトを使って配列オブジェクトの並べ替えを行います.配列項目が対象の場合、配列項目の属性に従って配列を並べ替える必要があります.
原理が同じである
var arr = [{name: "zlw", age: 24}, {name: "wlz", age: 25}];
var compare = function (obj1, obj2) {
    var val1 = obj1.name;
    var val2 = obj2.name;
    if (val1 < val2) {
        return -1;
    } else if (val1 > val2) {
        return 1;
    } else {
        return 0;
    }
}
console.log(arr.sort(compare));
出力結果は
[Object { name="wlz", age=25}, Object {name="zlw", age=24}] 
行列はもうnameによって見られます. 属性を並べ替えました.もし私がageに従って並べばいいです.
var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];
        if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }
    }
}
メッセージに従いたいなら 並べ替えを行います.arr.sort(compare(「age」) いいです
ここでもう一つの問題があります.配列がvar arr=[name:"zlw"であれば、age:"24","name:"wlz"であれば、age:"5"";;文字列の比較になります.エラーが発生します.
var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];
        if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
            val1 = Number(val1);
            val2 = Number(val2);
        }
        if (val1 < val2) {
            return -1;
        } else if (val1 > val2) {
            return 1;
        } else {
            return 0;
        }
    }
}
拡張内容
sort()の下にURLを実現します.https://github.com/v8/v8/blob/ad82a40509c5b5b4680d4299c8f08d6c6d31af3c/src/js/array.js 710行目
説明:異なるエンジンコードの下の実装原理が異なります.V 8エンジンを例にV 8 エンジン 関数は二つの並べ替えInsertionSortのみを与えた. QuickSortと10未満の配列はInsertionSortを使い、10の大きい配列よりQuickSortを使います.