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

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

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

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

Q&A

解決済

2回答

234閲覧

配列のソート null条件でかつ日付け条件でソートしたい

pokerStars

総合スコア67

JavaScript

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

0グッド

0クリップ

投稿2022/06/22 13:47

編集2022/06/22 13:47

js

1const list = [ 2 {name: "テスト太郎1", connectNumber: null, day: 1}, 3 {name: "テスト太郎2", connectNumber: 1, day: 2}, 4 {name: "テスト太郎3", connectNumber: null, day: 3}, 5 {name: "テスト太郎4", connectNumber: 22, day: 4}, 6 {name: "テスト太郎5", connectNumber: null, day: 5}, 7 {name: "テスト太郎6", connectNumber: 2, day: 6}, 8 ]; 9 10 consoale.log( list.sort((i1,i2)=>i1.connectNumber === null ? -1 : +1) ); 11// 結果 12[ 13 { name: 'テスト太郎5', connectNumber: null, day: 5 }, 14 { name: 'テスト太郎3', connectNumber: null, day: 3 }, 15 { name: 'テスト太郎1', connectNumber: null, day: 1 }, 16 { name: 'テスト太郎2', connectNumber: 1, day: 2 }, 17 { name: 'テスト太郎4', connectNumber: 22, day: 4 }, 18 { name: 'テスト太郎6', connectNumber: 2, day: 6 } 19] 20 21consoale.log( list.sort((i1,i2)=>i2.connectNumber === null ? -1 : +1) ); 22// 結果 23[ 24 { name: 'テスト太郎2', connectNumber: 1, day: 2 }, 25 { name: 'テスト太郎4', connectNumber: 22, day: 4 }, 26 { name: 'テスト太郎6', connectNumber: 2, day: 6 }, 27 { name: 'テスト太郎5', connectNumber: null, day: 5 }, 28 { name: 'テスト太郎3', connectNumber: null, day: 3 }, 29 { name: 'テスト太郎1', connectNumber: null, day: 1 } 30]

現在上記のような挙動をするsortロジックがあるのですが、dayを数字順に並べ替えたいです。

期待値

consoale.log( list.sort((i1,i2)=>i1.connectNumber === null ? -1 : +1) ); // 結果 [ { name: 'テスト太郎1', connectNumber: null, day: 1 }, { name: 'テスト太郎3', connectNumber: null, day: 3 }, { name: 'テスト太郎5', connectNumber: null, day: 5 }, { name: 'テスト太郎2', connectNumber: 1, day: 2 }, { name: 'テスト太郎4', connectNumber: 22, day: 4 }, { name: 'テスト太郎6', connectNumber: 2, day: 6 } ] consoale.log( list.sort((i1,i2)=>i2.connectNumber === null ? -1 : +1) ); // 結果 [ { name: 'テスト太郎2', connectNumber: 1, day: 2 }, { name: 'テスト太郎4', connectNumber: 22, day: 4 }, { name: 'テスト太郎6', connectNumber: 2, day: 6 }, { name: 'テスト太郎1', connectNumber: null, day: 1 } { name: 'テスト太郎3', connectNumber: null, day: 3 }, { name: 'テスト太郎5', connectNumber: null, day: 5 }, ]

期待値のようにするにはどのようにすればよいでしょうか? 
connectNumberがnullの中で日付け順、それ以外で日付け順とする方法がわかりませんでした。
何卒よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

null の時に適当な大きさの値を day値に付加してから比較する

js

1const 2 F = (t = false, C = 10000 * (!!t ? -1: 1))=> 3 (A, B)=> 4 (A.day + (A.connectNumber == null && C)) - (B.day + (B.connectNumber == null && C)); 5 6console.log([...list].sort (F(1))); 7console.log([...list].sort (F()));

投稿2022/06/22 16:29

babu_babu_baboo

総合スコア616

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

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

pokerStars

2022/06/23 13:22

ご回答ありがとうございます! そういうやり方もあるのですね勉強になります><
guest

0

ベストアンサー

おそらく、nullの部分とそうではない部分でソートを分けてしまった方がわかりやすくなるので、こちらの方法ではどうでしょうか?

js

1console.log([list.filter(i => i.connectNumber === null), list.filter(i => i.connectNumber !== null)].flatMap(l => l.sort((i1, i2) => i1 >= i2 ? 1 : -1)));

投稿2022/06/22 15:35

airRnot1106

総合スコア165

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

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

pokerStars

2022/06/23 13:20

ご回答ありがとうございます! filterで2つに絞るやり方など配列操作の勉強になりました。 感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問