質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1223閲覧

独自ルールでソートしたい(JavaScript)

spangl

総合スコア21

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/02/10 12:52

編集2021/02/10 12:56

やりたいこと

一致しない日時の情報を切り分けた上でソートし直したいです。

具体例

例)このリストを、本日時点の日時を基準に、日付が近い順にソートし直したい。

var events_list = [ { id: 1, name: '元旦', date: "2021-01-01T00:00:00.000000000Z" }, { id: 2, name: '桜祭り', date: "2021-03-01T10:00:00.000000000Z" }, { id: 3, name: '夏祭り', date: "2021-08-12T10:00:00.000000000Z" }, { id: 4 name: 'クリスマス', date: "2021-12-24T00:00:00.000000000Z" } ];
希望)本日2021/2/10を基準とした場合、このように並び替えたい。 var events_list = [ { id: 2, name: '桜祭り', date: "2021-03-01T10:00:00.000000000Z" }, { id: 1, name: '元旦', date: "2021-01-01T00:00:00.000000000Z" }, { id: 3, name: '夏祭り', date: "2021-08-12T10:00:00.000000000Z" }, { id: 4 name: 'クリスマス', date: "2021-12-24T00:00:00.000000000Z" } ];

現在の日時情報は、元々moment.jsを使って取得していたので
2021-02-19T00:00:00+09:00(例)が手元にあります。

試したこと

そのため、今はこう書いています。

var sortTime_reset = events_list.sort(function(a, b){  sortTime_a = a.date;  sortTime_b = b.date;  //events_listのdateから数字以外を削除、桁数を12桁に揃える  sortTime_str_a = sortTime_a     .substr(0, 16)     .replace( /-/g , "" ).replace( /:/g , "" ).replace( /T/g , "" );  sortTime_str_b = sortTime_b     .substr(0, 16)     .replace( /-/g , "" ).replace( /:/g , "" ).replace( /T/g , "" );  //現在時刻のフォーマット(2021-02-19T00:00:00+09:00)から数字以外を削除、桁数を12桁に揃える  sortTimeNow_str = time_now.substr(0, 16)   .replace( /-/g , "" )   .replace( /:/g , "" ).replace( /T/g , "" ).replace( /'+'/g , "" );  //現在時刻との差分を出す  sortTime_result_a = sortTimeNow_str - sortTime_str_a;  sortTime_result_b = sortTimeNow_str - sortTime_str_b; //比較  if (sortTime_result_a < sortTime_result_b ) {   return -1;  } else {   return 1;  } });

ただ、動かしてみてもソート前と変わらない並びのままです。
console.logで見る限り「現在時刻との差分を出す」までは動いているようなのですが、
それを元にevents_listを並び替えることができません…。

何かしらご教授いただければ幸いです。
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

javascript

1 //現在時刻との差分を出す 2 sortTime_result_a = sortTimeNow_str - sortTime_str_a; 3 sortTime_result_b = sortTimeNow_str - sortTime_str_b;

基準日との距離を比較したいのでしたら、差分の絶対値を比較する必要があります。

javascript

1 //現在時刻との差分を出す 2 const sortTime_result_a = Math.abs(sortTimeNow_str - sortTime_str_a); 3 const sortTime_result_b = Math.abs(sortTimeNow_str - sortTime_str_b);

いまどきのブラウザなら、Date.parse() が ISO 8601 形式をパーズできることは保証されているので、変に文字列操作しなくても Date.parse(a.date) で数値が返ります。

関数中の変数がすべてグローバル変数になってます。

投稿2021/02/10 13:11

編集2021/02/10 13:18
int32_t

総合スコア21008

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spangl

2021/02/15 09:59

『Date.parse(a.date)』、眼から鱗でした…! おかげさまでコード自体もかなり短く、以前よりずっと見やすいものに作り替えることができました。 差分の比較についてもおっしゃる通りです。 勉強になりました。レスつけてくださってありがとうございました!
guest

0

投稿2021/02/10 13:10

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spangl

2021/02/15 09:58

比較関数もわかっていなかった身で恐縮です… ですがお教えいただいた参考リンク、大変わかりやすかったです。ありがとうございます!
guest

0

(現在時刻 - 時刻A)という計算だと時刻Aが過去なら負の値になり未来なら正の値を取り、時刻Aがより未来なほど大きくなります。時間の間の距離を測るなら差を累乗するか、絶対値を取る必要があります。

Javascript

1 sortTime_result_a = (sortTimeNow_str - sortTime_str_a)**2; 2 sortTime_result_b = (sortTimeNow_str - sortTime_str_b)**2;

まず、比較関数だけでちゃんと思った通りに比較できてるかを確かめて、どこが思い通りじゃないのか問題を分解するようにしたほうがいいです。

投稿2021/02/10 13:20

aoies

総合スコア331

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

spangl

2021/02/15 10:02

「比較関数」という言葉さえよく分かっていなかったため、 お教えいただいたおかげで自分の疑問点をより粒度高く調べることができ、 また絶対数の出し方についても大変勉強になりました…。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問