配列の並べ替え問題について
4360 ワード
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"}]
確かに正しい方式で並べられています.この文章は基礎的なもので、技術的なものはあまりないです.最近のプロジェクトでは、行列の対象を並べ替える問題があります.ここに書いて共有してみてください.いつも友達の助けになると信じています.