回答編集履歴

7

テキスト修正

2020/09/28 09:25

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -36,27 +36,21 @@
36
36
 
37
37
  ```javascript
38
38
 
39
- data = data.map(a => {
39
+ data = data.map(a => (
40
40
 
41
- const score = parseFloat(a[key]);
41
+ { ...a, score: a[key] >= 0 ? +a[key] : DISQUALIFIED_SCORE }
42
42
 
43
- return {
43
+ ))
44
44
 
45
- ...a,
46
-
47
- score: Number.isNaN(score) ? DISQUALIFIED_SCORE : score }
48
-
49
- })
50
-
51
- .sort((a, b) => (ii === 'asc' ? 1 : -1) * (a.score - b.score));
45
+ .sort((a, b) => (ii === 'asc' ? 1 : -1) * (a.score - b.score));
52
46
 
53
47
  ```
54
48
 
55
- 上記では、ソート用に追加するキーを `score`としています。以下で動作確認できます。
49
+ 上記では、ソート用に追加するキーを `score`としています。また、有効なスコアを0上の数値としています。以下で動作確認できます。
56
50
 
57
51
 
58
52
 
59
- - **動作確認用Codepen: **[codepen.io/jun68ykt/pen/OJNGNqM](https://codepen.io/jun68ykt/pen/OJNGNqM?editors=0012)
53
+ - **動作確認用Codepen: **[codepen.io/jun68ykt/pen/abNxJLZ](https://codepen.io/jun68ykt/pen/abNxJLZ?editors=0012)
60
54
 
61
55
 
62
56
 

6

テキスト修正

2020/09/28 09:25

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
  ...a,
46
46
 
47
- score: Number.isNaN(score) ? DISQUALIFIED_SCORE : score };
47
+ score: Number.isNaN(score) ? DISQUALIFIED_SCORE : score }
48
48
 
49
49
  })
50
50
 

5

テキスト修正

2020/09/28 08:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
 
72
72
 
73
- もうひとつ、別の方法を挙げておきます。与えられた`data`全体をソートするのではなく、ソート対象プロパティを数値に変換したときに`NaN`にならないオブジェクトだけを集めた配列を作り、ソートはこの配列に対して行って、ソート後に失格のオブジェクトのみを集めた配列と結合するという考え方です。
73
+ もうひとつ、別の方法を挙げておきます。与えられた`data`全体をソートするのではなく、失格ではないデータ(= ソート対象プロパティを数値に変換したときに`NaN`にならないオブジェクト) だけを集めた配列を作り、ソートはこの配列に対して行って、ソート後に失格のオブジェクトのみを集めた配列と結合するという考え方です。
74
74
 
75
75
 
76
76
 

4

テキスト修正

2020/09/28 08:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -63,3 +63,51 @@
63
63
 
64
64
 
65
65
  以上、参考になれば幸いです。
66
+
67
+
68
+
69
+ ### 追記
70
+
71
+
72
+
73
+ もうひとつ、別の方法を挙げておきます。与えられた`data`全体をソートするのではなく、ソート対象プロパティを数値に変換したときに`NaN`にならないオブジェクトだけを集めた配列を作り、ソートはこの配列に対して行って、ソート後に失格のオブジェクトのみを集めた配列と結合するという考え方です。
74
+
75
+
76
+
77
+ 以下はそのコード例です。(有効なスコアは0以上の数値であることを前提にしています。)
78
+
79
+
80
+
81
+ ```javascript
82
+
83
+ // 有効なスコアを持つオブジェクトのみの配列を作り、昇順にソートする。
84
+
85
+ const qualifiedData = data.filter(a => a[key] >= 0).sort((a,b) => a[key] - b[key]);
86
+
87
+
88
+
89
+ // 失格のオブジェクトのみを持つ配列を作る
90
+
91
+ const disqualifiedData = data.filter(a => Number.isNaN(+a[key]));
92
+
93
+
94
+
95
+ // data を、有効スコアの配列と失格スコアの配列を結合した配列に置き換える。
96
+
97
+ data = [...qualifiedData, ...disqualifiedData];
98
+
99
+
100
+
101
+ // 降順指定であれば、全体の順序を逆にする。
102
+
103
+ if (ii == 'desc') {
104
+
105
+ data.reverse();
106
+
107
+ }
108
+
109
+ ```
110
+
111
+
112
+
113
+ - **動作確認用Codepen: **[codepen.io/jun68ykt/pen/poyBEEB](https://codepen.io/jun68ykt/pen/poyBEEB?editors=0012)

3

テキスト修正

2020/09/28 05:49

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 比較対象のどちらか(あるいは両方)の`parseFloat`が失敗して、`NaN`が返されてきた場合の条件分岐や対応を、`sort`に与える関数の中に入れてしまうと、やや煩雑になってしまいます。このようなときに自分がよくやる手は、`sort` の前に `map` を挟んで、配列要素のオブジェクトに 、`NaN`のような(全順序関係を崩す)値をとらない、ソートキー別のプロパティを追加して、`sort`に与える関数をできるだけ簡単にことです。
5
+ 比較対象のどちらか(あるいは両方)の`parseFloat`が失敗して、`NaN`が返されてきた場合の条件分岐や対応を、`sort`に与える比較関数の中に入れてしまうと、やや煩雑になってしまいます。このようなときに自分がよくやる手は、`sort` の前に `map` を挟んで、配列要素のオブジェクトに 、ソートキーになる別のプロパティを追加することです。追加プロパティの値は、`NaN`のような(全順序関係を崩す)値をとらないよう配慮された数値とすことで、`sort`に与える比較関数を簡単に書けようにします。
6
6
 
7
7
 
8
8
 

2

テキスト修正

2020/09/28 04:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- `sort`に与える関数の中に比較対象のどちらかが文字列だった場合の処理を入れてしまうと、やや煩雑になってしまうので、このようなときに自分がよくやる手は、`sort` の前に `map` を挟んで、配列要素のオブジェクトに 、`NaN`のような(全順序関係を崩す)値をとらない、ソートキーになるプロパティを追加することです。
5
+ 比較対象のどちらか(あるいは両方)の`parseFloat`が失敗して、`NaN`が返されてきた場合の条件分岐や対応を、`sort`に与える関数の中に入れてしまうと、やや煩雑になってしまいます。このようなときに自分がよくやる手は、`sort` の前に `map` を挟んで、配列要素のオブジェクトに 、`NaN`のような(全順序関係を崩す)値をとらない、ソートキーになる別のプロパティを追加して、`sort`に与える関数をできるだけ簡単にすることです。
6
6
 
7
7
 
8
8
 

1

テキスト修正

2020/09/28 04:21

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  })
50
50
 
51
- .sort((a, b) => a.score - b.score);
51
+ .sort((a, b) => (ii === 'asc' ? 1 : -1) * (a.score - b.score));
52
52
 
53
53
  ```
54
54