2020年9月6日(日)
[JavaScript] 2次元配列を複数のキーでソート #■パソコン・通信 JavaScriptで配列のソートはあまり使わないのですが、[開催日時]を複数入力できるように改良しようとして、必要に迫られました。
使っているコマンドは2種類です。条件式さえ理解すれば、お茶の子さいさいです。
return
1は入れ替える、
return
-1は入れ替えない、最後のreturn
0はそのまま(入れ替えない)ということです。大小比較して等しい場合は、次の条件式へ移ります。
①条件式でソート
arr.sort(function(a,b){return(a[1]-b[1]);});
arr.sort(function(a,b){
//
第1条件式
if(a[1]
>
b[1])
return
1;
if(a[1]
<
b[1])
return
-1;
//
第2条件式
if(a[2]
>
b[2])
return
1;
if(a[2]
<
b[2])
return
-1;
:
:
:
return
0;
});
②第一行を削除
arr.shift();
今回のプログラミングから抜粋しました。プログラマーなら、何をやっているのか、一目で理解できると思います。条件式でMath.sign()が使えたので、未入力0を後回しにしてから、ソートしています。
--
//
//
日付の配列変数
//
[ID,開始日,開始時刻,終了日,終了時刻,完成品判別]
//
$date_sort
=
[
[1,0,0,0,0,0],
[2,0,0,0,0,0],
[3,0,0,0,0,0],
[4,0,0,0,0,0]
];
/*
データ入力、完成品判別は省略
*/
/*
//
//
確認
org
//
$data
=
'org\n';
for($i=0;
$i
<
$date_sort.length;
$i++){
$data
+=
'['+$date_sort[$i][0]+']'+$date_sort[$i][1]+'/'+$date_sort[$i][2]+'/'+$date_sort[$i][3]+'/'+$date_sort[$i][4]+' '+$date_sort[$i][5]+'\n';
}
*/
//
//
すべて未入力のタブを削除
//
//
昇順にソート
$date_sort.sort(function(a,b){
if(a[1]
>
b[1])
return
1;
if(a[1]
<
b[1])
return
-1;
if(a[2]
>
b[2])
return
1;
if(a[2]
<
b[2])
return
-1;
if(a[3]
>
b[3])
return
1;
if(a[3]
<
b[3])
return
-1;
if(a[4]
>
b[4])
return
1;
if(a[4]
<
b[4])
return
-1;
return
0;
});
//
未入力のタブを削除
while($date_sort[0][1]+$date_sort[0][2]+$date_sort[0][3]+$date_sort[0][4]
==
0){
if($date_sort.length
==
1){
//
タブを1つは残す。
break;
}else{
$date_sort.shift();
}
}
//
//
完成品判別→開始日→開始時刻→終了日→終了時刻でソート
//
$date_sort.sort(function(a,b){
//
完成品を先へ
if(a[5]
>
b[5])
return
-1;
if(a[5]
<
b[5])
return
1;
//
開始日:未入力を後に、入力済みをソート
if(
Math.sign(a[1])
>
Math.sign(b[1])
)
return
-1;
if(
Math.sign(a[1])
<
Math.sign(b[1])
)
return
1;
if(a[1]
>
b[1])
return
1;
if(a[1]
<
b[1])
return
-1;
//
開始時刻:未入力を後に、入力済みをソート
if(
Math.sign(a[2])
>
Math.sign(b[2])
)
return
-1;
if(
Math.sign(a[2])
<
Math.sign(b[2])
)
return
1;
if(a[2]
>
b[2])
return
1;
if(a[2]
<
b[2])
return
-1;
//
終了日:未入力を後に、入力済みをソート
if(
Math.sign(a[3])
>
Math.sign(b[3])
)
return
-1;
if(
Math.sign(a[3])
<
Math.sign(b[3])
)
return
1;
if(a[3]
>
b[3])
return
1;
if(a[3]
<
b[3])
return
-1;
//
終了時刻:未入力を後に、入力済みをソート
if(
Math.sign(a[4])
>
Math.sign(b[4])
)
return
-1;
if(
Math.sign(a[4])
<
Math.sign(b[4])
)
return
1;
if(a[4]
>
b[4])
return
1;
if(a[4]
<
b[4])
return
-1;
return
0;
});
/*
//
//
確認
last
//
$data
=
'last\n';
for($i=0;
$i
<
$date_sort.length;
$i++){
$data
+=
'['+$date_sort[$i][0]+']'+$date_sort[$i][1]+'/'+$date_sort[$i][2]+'/'+$date_sort[$i][3]+'/'+$date_sort[$i][4]+' '+$date_sort[$i][5]+'\n';
}
alert($data);
*/
--