配列の並べ替え問題について


var arr = [5,1,3,7,0,9,4,2,6,8];

//      
function arrsort(arr){
    var length = arr.length,temp;
    for(var i = 0; i < length - 1; i++){
        for(var j = 0; j < length - 1; j++){
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    return arr;
};
//      
console.log(arrsort(arr));
// sort()   ,       
console.log(arr.sort());
//      
console.log(arr.reverse());
jsではメソッドsort()を配列に並べ替えます.sort()法は元素の順序を決定するための関数であるオプションのパラメータがあります.このパラメータが省略されている場合、配列の要素はASCII文字順に並べ替えられます.例えば:
var arr = ["a", "b", "A", "B"];
arr.sort();
console.log(arr);//["A", "B", "a", "b"]
    A、B ASCII    65、66, a、b     97、98,           ["A", "B", "a", "b"] 。

            ,      ?

var arr = [15, 8, 25, 3];
arr.sort();
console.log(arr);//[15, 25, 3, 8]
結果は[15,25,3,8]です.実際には、sortメソッドは、各配列項目のtoString()メソッドを呼び出し、文字列を取得してから、得られた文字列を並べ替えます.数値15は3より大きいですが、文字列比較を行う場合は「15」が3の前になります.明らかに、この結果は私たちが望んでいるものではないです.このとき、ソト()法のパラメータが役割を果たします.私たちはこのパラメータを比較関数と呼びます.
比較関数は2つのパラメータを受信し、最初のパラメータが2番目の前にあるべきなら負の値を返し、2つのパラメータが等しいなら0を返し、最初のパラメータが2番目の後にあるべきなら正の値を返します.例:
var arr = [23, 9, 4, 78, 3];
var compare = function (x, y) {//    
    if (x < y) {
        return -1;
    } else if (x > y) {
        return 1;
    } else {
        return 0;
    }
}
console.log(arr.sort(compare));        
結果は[3,4,9,23,78]です.降順で並べ替えるなら、比較関数はこのように書けばいいです.
var compare = function (x, y) {
    if (x < y) {
        return 1;
    } else if (x > y) {
        return -1;
    } else {
        return 0;
    }
}
比較関数では、数値に変換できない文字列と数字の順序を比較できません.
var arr = ["b", 5];
console.log(arr.sort(compare))
結果は[b],5]です.比較関数は比較時に文字列を数字に変換してから比較します.文字列bは数字に変換できないので、比較できません.しかし、関数を比較しないとASCII値が比較されますので、結果は[5,b]です.
二、配列オブジェクトの並べ替えが対象の場合、配列項目の属性に従って配列を並べ替える必要がありますが、どうすればいいですか?前の比較関数と同じです.
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属性に従ってソートされていることがわかる.上の比較関数を改造してもいいです.
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;
        }            
    } 
}
ageで並べ替えたいなら、arr.sort(compare)でいいです.
ただし、age属性を並べ替える際には注意が必要です.age属性の値が数字であれば、並べ替え結果は私達が欲しいです.しかし、多くの場合、私たちはサーバーから送られてきたデータの中で、属性値は通常文字列です.上の配列を次のように変更します.
var arr=[{name:"zlw],age:"24",{name:"wlz],age:"5"};age属性を数字から文字列に変更し、2番目の配列項目のage値を5に変更することができます.再度arr.sortを呼び出したところ、次のような結果が出ました.
[Object{name=“zlw”、age=“24”、Object{name=“wlz”、age=“5”}は私達の期待は5列で25前ですが、結果は違います.これは、2つの数字文字列が比較的大きい場合、ASCII値の大きさを比較します.比較規則は、最初の文字から順番に後に異なる文字が現れるまで、最初の異なる文字のASCII値でサイズを決定します.したがって、「24」と「5」は比較的大きい時間で、「2」と「5」のASCII値を比較して、明らかに「2」のASCII値は「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;
        }            
    } 
}
比較関数では、まず比較属性値を数字Number(val 1)に変換して通過します.転化後の値が数字かどうかを判断します.転化後の値が数字であれば、変換後の値を比較します.
arr.sort(compare("age"))   :
[Object { name="wlz", age="5"}, Object { name="zlw", age="24"}]
確かに正しい方式で並べられています.
この文章は基礎的なもので、技術的なものはあまりないです.最近のプロジェクトでは、行列の対象を並べ替える問題があります.ここに書いて共有してみてください.いつも友達の助けになると信じています.