ガレコレ
Garage Collection
 
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);
*/
--
 
お問い合わせ
by Network Communication Note