質問するログイン新規登録

回答編集履歴

7

テキスト修正

2020/09/28 09:25

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -17,17 +17,14 @@
17
17
  上記で決めた `DISQUALIFIED_SCORE` を使って、冒頭に書いた `map`を挟むコードの一案は以下です。
18
18
 
19
19
  ```javascript
20
- data = data.map(a => {
20
+ data = data.map(a => (
21
- const score = parseFloat(a[key]);
22
- return {
23
- ...a,
24
- score: Number.isNaN(score) ? DISQUALIFIED_SCORE : score }
21
+ { ...a, score: a[key] >= 0 ? +a[key] : DISQUALIFIED_SCORE }
25
- })
22
+ ))
26
- .sort((a, b) => (ii === 'asc' ? 1 : -1) * (a.score - b.score));
23
+ .sort((a, b) => (ii === 'asc' ? 1 : -1) * (a.score - b.score));
27
24
  ```
28
- 上記では、ソート用に追加するキーを `score`としています。以下で動作確認できます。
25
+ 上記では、ソート用に追加するキーを `score`としています。また、有効なスコアを0上の数値としています。以下で動作確認できます。
29
26
 
30
- - **動作確認用Codepen: **[codepen.io/jun68ykt/pen/OJNGNqM](https://codepen.io/jun68ykt/pen/OJNGNqM?editors=0012)
27
+ - **動作確認用Codepen: **[codepen.io/jun68ykt/pen/abNxJLZ](https://codepen.io/jun68ykt/pen/abNxJLZ?editors=0012)
31
28
 
32
29
 
33
30
  以上、参考になれば幸いです。

6

テキスト修正

2020/09/28 09:25

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -21,7 +21,7 @@
21
21
  const score = parseFloat(a[key]);
22
22
  return {
23
23
  ...a,
24
- score: Number.isNaN(score) ? DISQUALIFIED_SCORE : score };
24
+ score: Number.isNaN(score) ? DISQUALIFIED_SCORE : score }
25
25
  })
26
26
  .sort((a, b) => (ii === 'asc' ? 1 : -1) * (a.score - b.score));
27
27
  ```

5

テキスト修正

2020/09/28 08:58

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  ### 追記
36
36
 
37
- もうひとつ、別の方法を挙げておきます。与えられた`data`全体をソートするのではなく、ソート対象プロパティを数値に変換したときに`NaN`にならないオブジェクトだけを集めた配列を作り、ソートはこの配列に対して行って、ソート後に失格のオブジェクトのみを集めた配列と結合するという考え方です。
37
+ もうひとつ、別の方法を挙げておきます。与えられた`data`全体をソートするのではなく、失格ではないデータ(= ソート対象プロパティを数値に変換したときに`NaN`にならないオブジェクト) だけを集めた配列を作り、ソートはこの配列に対して行って、ソート後に失格のオブジェクトのみを集めた配列と結合するという考え方です。
38
38
 
39
39
  以下はそのコード例です。(有効なスコアは0以上の数値であることを前提にしています。)
40
40
 

4

テキスト修正

2020/09/28 08:36

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -30,4 +30,28 @@
30
30
  - **動作確認用Codepen: **[codepen.io/jun68ykt/pen/OJNGNqM](https://codepen.io/jun68ykt/pen/OJNGNqM?editors=0012)
31
31
 
32
32
 
33
- 以上、参考になれば幸いです。
33
+ 以上、参考になれば幸いです。
34
+
35
+ ### 追記
36
+
37
+ もうひとつ、別の方法を挙げておきます。与えられた`data`全体をソートするのではなく、ソート対象プロパティを数値に変換したときに`NaN`にならないオブジェクトだけを集めた配列を作り、ソートはこの配列に対して行って、ソート後に失格のオブジェクトのみを集めた配列と結合するという考え方です。
38
+
39
+ 以下はそのコード例です。(有効なスコアは0以上の数値であることを前提にしています。)
40
+
41
+ ```javascript
42
+ // 有効なスコアを持つオブジェクトのみの配列を作り、昇順にソートする。
43
+ const qualifiedData = data.filter(a => a[key] >= 0).sort((a,b) => a[key] - b[key]);
44
+
45
+ // 失格のオブジェクトのみを持つ配列を作る
46
+ const disqualifiedData = data.filter(a => Number.isNaN(+a[key]));
47
+
48
+ // data を、有効スコアの配列と失格スコアの配列を結合した配列に置き換える。
49
+ data = [...qualifiedData, ...disqualifiedData];
50
+
51
+ // 降順指定であれば、全体の順序を逆にする。
52
+ if (ii == 'desc') {
53
+ data.reverse();
54
+ }
55
+ ```
56
+
57
+ - **動作確認用Codepen: **[codepen.io/jun68ykt/pen/poyBEEB](https://codepen.io/jun68ykt/pen/poyBEEB?editors=0012)

3

テキスト修正

2020/09/28 05:49

投稿

jun68ykt
jun68ykt

スコア9058

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

2

テキスト修正

2020/09/28 04:48

投稿

jun68ykt
jun68ykt

スコア9058

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

1

テキスト修正

2020/09/28 04:21

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -23,7 +23,7 @@
23
23
  ...a,
24
24
  score: Number.isNaN(score) ? DISQUALIFIED_SCORE : score };
25
25
  })
26
- .sort((a, b) => a.score - b.score);
26
+ .sort((a, b) => (ii === 'asc' ? 1 : -1) * (a.score - b.score));
27
27
  ```
28
28
  上記では、ソート用に追加するキーを `score`としています。以下で動作確認できます。
29
29