回答編集履歴
7
追記
    
        answer	
    CHANGED
    
    | 
         @@ -48,4 +48,12 @@ 
     | 
|
| 
       48 
48 
     | 
    
         
             
            ```
         
     | 
| 
       49 
49 
     | 
    
         
             
            s = "XSRF-TOKEN=m1PFe1BVJVap7HZ2IugHUC82tMaymy4; expires=Thu, 17-Aug-2023 08:45:36 GMT; path=/; domain=.ppy.sh; secure, osu_session=akJpdiI6InQycEZXYWVWdGdpSOUMieidGFnIjoiIn0%3D; expires=Thu, 17-Aug-2023 08:45:36 GMT; path=/; domain=.ppy.sh; secure; httponly";
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
            console.log(parseCookies(s));
         
     | 
| 
      
 51 
     | 
    
         
            +
            console.log(parseCookies(s));
         
     | 
| 
      
 52 
     | 
    
         
            +
            ```
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            ---
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            試してないですが、こういうのもあるそうです。
         
     | 
| 
      
 58 
     | 
    
         
            +
            set-cookie-parser -npm
         
     | 
| 
      
 59 
     | 
    
         
            +
            https://www.npmjs.com/package/set-cookie-parser
         
     | 
6
ついき
    
        answer	
    CHANGED
    
    | 
         @@ -1,6 +1,8 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            いささか力技ですし汎用性に乏しいですが、下記のようになるでしょうか。
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
      
 3 
     | 
    
         
            +
            > 「expires」の値の「, 」で正常に分割できない
         
     | 
| 
      
 4 
     | 
    
         
            +
            ですよね~。日付のカンマが邪魔。
         
     | 
| 
       3 
     | 
    
         
            -
            アプローチとしては、日付のカンマ 
     | 
| 
      
 5 
     | 
    
         
            +
            だからアプローチとしては、**日付のカンマを先にrfc2822の正規表現で抜き出してマジックナンバーに一時的に変えてやります。**
         
     | 
| 
       4 
6 
     | 
    
         
             
            あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
         
     | 
| 
       5 
7 
     | 
    
         | 
| 
       6 
8 
     | 
    
         
             
            + キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。
         
     | 
5
tuiki
    
        answer	
    CHANGED
    
    | 
         @@ -4,7 +4,7 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
            あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            + キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。
         
     | 
| 
       7 
     | 
    
         
            -
            + rfc2822形式の日付文字列以外で、値にカンマ+半角スペースが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう)
         
     | 
| 
      
 7 
     | 
    
         
            +
            + rfc2822形式の日付文字列以外で、値にカンマ+半角スペースが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう。そもそも[仕様がきちんとしてないっぽい](https://stackoverflow.com/questions/2880047/is-it-possible-to-set-more-than-one-cookie-with-a-single-set-cookie)という話)
         
     | 
| 
       8 
8 
     | 
    
         
             
            ```js
         
     | 
| 
       9 
9 
     | 
    
         
             
            const TIMESTAMP_IDENTIFIER = '$_TIMESTAMP_$';
         
     | 
| 
       10 
10 
     | 
    
         | 
4
修正
    
        answer	
    CHANGED
    
    | 
         @@ -14,13 +14,12 @@ 
     | 
|
| 
       14 
14 
     | 
    
         
             
            }
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
            function parseCookies(cookiesString) {
         
     | 
| 
       17 
     | 
    
         
            -
              result = [];
         
     | 
| 
       18 
17 
     | 
    
         
             
              // 日付のカンマを一時的に別の文字列に修正
         
     | 
| 
       19 
18 
     | 
    
         
             
              const parsed = parseRFC2822(cookiesString);
         
     | 
| 
       20 
19 
     | 
    
         
             
              // クッキーの組に分ける
         
     | 
| 
       21 
20 
     | 
    
         
             
              const segments = parsed.split(', ');
         
     | 
| 
       22 
21 
     | 
    
         
             
              // segmentごとにクッキー解析
         
     | 
| 
       23 
     | 
    
         
            -
              result = segments.map(segment => {
         
     | 
| 
      
 22 
     | 
    
         
            +
              const result = segments.map(segment => {
         
     | 
| 
       24 
23 
     | 
    
         
             
                const cookiePairs = segment.split('; ');
         
     | 
| 
       25 
24 
     | 
    
         
             
                let cookie = {};
         
     | 
| 
       26 
25 
     | 
    
         
             
                cookiePairs.forEach((cookiePair, index) => {
         
     | 
3
修正
    
        answer	
    CHANGED
    
    | 
         @@ -16,8 +16,8 @@ 
     | 
|
| 
       16 
16 
     | 
    
         
             
            function parseCookies(cookiesString) {
         
     | 
| 
       17 
17 
     | 
    
         
             
              result = [];
         
     | 
| 
       18 
18 
     | 
    
         
             
              // 日付のカンマを一時的に別の文字列に修正
         
     | 
| 
       19 
     | 
    
         
            -
              const parsed = parseRFC2822(cookiesString)
         
     | 
| 
      
 19 
     | 
    
         
            +
              const parsed = parseRFC2822(cookiesString);
         
     | 
| 
       20 
     | 
    
         
            -
              // クッキーの組 
     | 
| 
      
 20 
     | 
    
         
            +
              // クッキーの組に分ける
         
     | 
| 
       21 
21 
     | 
    
         
             
              const segments = parsed.split(', ');
         
     | 
| 
       22 
22 
     | 
    
         
             
              // segmentごとにクッキー解析
         
     | 
| 
       23 
23 
     | 
    
         
             
              result = segments.map(segment => {
         
     | 
| 
         @@ -25,13 +25,13 @@ 
     | 
|
| 
       25 
25 
     | 
    
         
             
                let cookie = {};
         
     | 
| 
       26 
26 
     | 
    
         
             
                cookiePairs.forEach((cookiePair, index) => {
         
     | 
| 
       27 
27 
     | 
    
         
             
                  if (index === 0) {
         
     | 
| 
       28 
     | 
    
         
            -
                     
     | 
| 
      
 28 
     | 
    
         
            +
                    const parts = cookiePair.split('=');
         
     | 
| 
       29 
     | 
    
         
            -
                    cookie.key =  
     | 
| 
      
 29 
     | 
    
         
            +
                    cookie.key = parts[0];
         
     | 
| 
       30 
     | 
    
         
            -
                    cookie.value =  
     | 
| 
      
 30 
     | 
    
         
            +
                    cookie.value = parts.slice(1).join("=");
         
     | 
| 
       31 
31 
     | 
    
         
             
                  } else if (cookiePair.includes('=')) {
         
     | 
| 
       32 
     | 
    
         
            -
                    parts = cookiePair.split('=' 
     | 
| 
      
 32 
     | 
    
         
            +
                    const parts = cookiePair.split('=');
         
     | 
| 
       33 
33 
     | 
    
         
             
                    const key_ = parts[0];
         
     | 
| 
       34 
     | 
    
         
            -
                    const val_ = parts 
     | 
| 
      
 34 
     | 
    
         
            +
                    const val_ = parts.slice(1).join("=").replace(TIMESTAMP_IDENTIFIER, ',');
         
     | 
| 
       35 
35 
     | 
    
         
             
                    cookie[key_] = val_;
         
     | 
| 
       36 
36 
     | 
    
         
             
                  } else {
         
     | 
| 
       37 
37 
     | 
    
         
             
                    cookie[cookiePair] = true;
         
     | 
2
修正
    
        answer	
    CHANGED
    
    | 
         @@ -4,7 +4,7 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
            あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            + キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。
         
     | 
| 
       7 
     | 
    
         
            -
            + rfc2822形式の日付文字列以外で、値にカンマが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう)
         
     | 
| 
      
 7 
     | 
    
         
            +
            + rfc2822形式の日付文字列以外で、値にカンマ+半角スペースが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう)
         
     | 
| 
       8 
8 
     | 
    
         
             
            ```js
         
     | 
| 
       9 
9 
     | 
    
         
             
            const TIMESTAMP_IDENTIFIER = '$_TIMESTAMP_$';
         
     | 
| 
       10 
10 
     | 
    
         | 
1
    
        answer	
    CHANGED
    
    | 
         @@ -4,7 +4,7 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
            あとは「, 」でクッキーの組に分けて、各組をさらにパースしてやる感じで。
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            + キーの順番がバラバラなのは仕方ないと割り切ってください。「オブジェクトでまとめる」という要件ですし。
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
            + rfc2822形式の日付文字列以外で、値にカンマが入っているようなクッキーには対応してません。(これは個別に対応するしかないでしょう)
         
     | 
| 
       8 
8 
     | 
    
         
             
            ```js
         
     | 
| 
       9 
9 
     | 
    
         
             
            const TIMESTAMP_IDENTIFIER = '$_TIMESTAMP_$';
         
     | 
| 
       10 
10 
     | 
    
         |