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

回答編集履歴

2

追加

2018/12/07 02:26

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -18,4 +18,36 @@
18
18
  const numB = Number(b.replace(/[^\d]/g, ''));
19
19
  return numA - numB;
20
20
  }});
21
- ```
21
+ ```
22
+
23
+ ---
24
+ 追加
25
+ 要件が違うらしいので、とりあえずtinysortにかますまえに、検証用にサンプル関数を書いてみます。
26
+ ```javascript
27
+ const comparer = (a,b) => {
28
+ const reg = /^([^\d]*)(\d+)(.*)$/;
29
+ const paramA = a.match(reg).slice(1,4);
30
+ const paramB = b.match(reg).slice(1,4);
31
+ console.log(paramA);
32
+ console.log(paramB);
33
+
34
+ if(paramA[0] !== paramB[0]) { return stringComparer(paramA[0], paramB[0]); }
35
+ const numA = Number(paramA[1]);
36
+ const numB = Number(paramB[1]);
37
+ if(numA !== numB) { return numA - numB; }
38
+ console.log("2");
39
+
40
+ return stringComparer(paramA[2], paramB[2]);;
41
+ }
42
+ const stringComparer = (a, b) => {
43
+ if (a < b) { return -1; }
44
+ if (a > b) { return 1; }
45
+ return 0;
46
+ }
47
+ console.log(["2月","10月","9月","8月","12月"].sort(comparer));
48
+ console.log(["第2回目","第10回目","第9回目","第8回目","第12回目"].sort(comparer));
49
+ console.log(["A2","A10","A9","A8","A12"].sort(comparer));
50
+ console.log(["2月","10月","第3回目","ABC999の9", "ABC999の0","BBB31","1月"].sort(comparer));
51
+ ```
52
+ この例では、AAA999の8とaaa999の7とAAA999の6が大文字小文字を無視して並ぶようにはなりません。いずれにしても明確な仕様を作ってもらわないことにはコードはかけません。
53
+ また、関数を使えばこういうことができる、というのが私の回答ですので、どういう関数を作るかは質問者様の仕様と技術でカバーしてください(仕様を提示してこのコード書いてというなら作業委託してください)

1

rep

2018/12/07 02:26

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -1,1 +1,21 @@
1
- optionとしてsortFunctionを指定できるようなので、月を消して数値化して比較するような関数を渡せばできると思います
1
+ optionとしてsortFunctionを指定できるようなので、月を消して数値化して比較するような関数を渡せばできると思います
2
+
3
+ まず↓でテストしてみてください(chromeでF12を押してconsoleで実行するなど)
4
+ ```javascript
5
+ const comparer = (a,b) => {
6
+ const numA = Number(a.replace(/[^\d]/g, ''));
7
+ const numB = Number(b.replace(/[^\d]/g, ''));
8
+ return numA - numB;
9
+ }
10
+ console.log(["2月","10月","9月","8月","12月"].sort(comparer));
11
+ console.log(["第2回目","第10回目","第9回目","第8回目","第12回目"].sort(comparer));
12
+ console.log(["A2","A10","A9","A8","A12"].sort(comparer));
13
+ ```
14
+ 納得できたら、↓こういう感じに書いてください
15
+ ```javascript
16
+ tinysort('ul#xcst>li',{sortFunction:function(a,b) {
17
+ const numA = Number(a.replace(/[^\d]/g, ''));
18
+ const numB = Number(b.replace(/[^\d]/g, ''));
19
+ return numA - numB;
20
+ }});
21
+ ```