回答編集履歴
7
テキスト修正
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
|
-
|
21
|
+
{ ...a, score: a[key] >= 0 ? +a[key] : DISQUALIFIED_SCORE }
|
25
|
-
|
22
|
+
))
|
26
|
-
|
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/
|
27
|
+
- **動作確認用Codepen: **[codepen.io/jun68ykt/pen/abNxJLZ](https://codepen.io/jun68ykt/pen/abNxJLZ?editors=0012)
|
31
28
|
|
32
29
|
|
33
30
|
以上、参考になれば幸いです。
|
6
テキスト修正
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
テキスト修正
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
テキスト修正
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
テキスト修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
こんにちは
|
2
2
|
|
3
|
-
比較対象のどちらか(あるいは両方)の`parseFloat`が失敗して、`NaN`が返されてきた場合の条件分岐や対応を、`sort`に与える関数の中に入れてしまうと、やや煩雑になってしまいます。このようなときに自分がよくやる手は、`sort` の前に `map` を挟んで、配列要素のオブジェクトに 、`NaN`のような(全順序関係を崩す)値をとらない
|
3
|
+
比較対象のどちらか(あるいは両方)の`parseFloat`が失敗して、`NaN`が返されてきた場合の条件分岐や対応を、`sort`に与える比較関数の中に入れてしまうと、やや煩雑になってしまいます。このようなときに自分がよくやる手は、`sort` の前に `map` を挟んで、配列要素のオブジェクトに 、ソートキーになる別のプロパティを追加することです。追加プロパティの値は、`NaN`のような(全順序関係を崩す)値をとらないように配慮された数値とすることで、`sort`に与える比較関数を簡単に書けるようにします。
|
4
4
|
|
5
5
|
以下はそのサンプルです。
|
6
6
|
|
2
テキスト修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
こんにちは
|
2
2
|
|
3
|
-
|
3
|
+
比較対象のどちらか(あるいは両方)の`parseFloat`が失敗して、`NaN`が返されてきた場合の条件分岐や対応を、`sort`に与える関数の中に入れてしまうと、やや煩雑になってしまいます。このようなときに自分がよくやる手は、`sort` の前に `map` を挟んで、配列要素のオブジェクトに 、`NaN`のような(全順序関係を崩す)値をとらない、ソートキーになる別のプロパティを追加して、`sort`に与える関数をできるだけ簡単にすることです。
|
4
4
|
|
5
5
|
以下はそのサンプルです。
|
6
6
|
|
1
テキスト修正
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
|
|