2017-10-18 7 views
0

アイテムを日付で配列にグループ化するにはどうすればよいですか?オブジェクトの以下の配列を指定して

[ 
{ 
"notes": "Game was played", 
"time": "2017-10-04T20:24:30+00:00", 
"sport": "hockey", 
"owner": "steve", 
"players": "10", 
"game_id": 1, 
}, 
{ 
"notes": "Game was played", 
"time": "2017-10-04T12:35:30+00:00", 
"sport": "lacrosse", 
"owner": "steve", 
"players": "6", 
"game_id": 2, 
}, 
{ 
"notes": "Game was played", 
"time": "2017-10-14T20:32:30+00:00", 
"sport": "hockey", 
"owner": "steve", 
"players": "4", 
"game_id": 3, 
}, 
{ 
"notes": "Game was played", 
"time": "2017-10-04T10:12:30+00:00", 
"sport": "hockey", 
"owner": "henry", 
"players": "10", 
"game_id": 4, 
}, 
{ 
"notes": "Game was played", 
"time": "2017-10-14T20:34:30+00:00", 
"sport": "soccer", 
"owner": "john", 
"players": "12", 
"game_id": 5, 
} 
] 

私は新しい配列を作成しようとしています、(キーなど)各日付でオブジェクトを作成し、あらゆるゲームがゲームの下にリストされたその日に演奏(別キー)を指定します。

新しい配列は、次のようになります。ここでは

[ 
{ 
date:'date string', 
games:[array of games played on the date] 
}, 
{ 
date: 'other date', 
games:[games under the other date] 
} 
]... 

は私がやっていることです:

let t = this.state.data; (data above) 
     let list = []; 
     for (let i = 0; i < t.length; i++) { 
      let dates = t[i].time.slice(0,10); 

      if (!list[dates]) { 
       list[dates] = []; 
      } 
      list[dates].push(t[i]); 
     } 

私のバージョンでは、これらの内、値として日付を持つ配列を返し、ゲームはリストされていますが、私は別のキーと同じオブジェクトにそれらをリストしようとしています。

何か助けや指導をいただければ幸いです。

+1

あなたは、これまで何を試してみましたか?ここでの解決方法は非常に簡単です。 –

+0

こんにちはスペンサー、私はコメントにコードを投稿する方法はわかりませんが、空の配列を作成し、forループを実行して最初の情報を繰り返します。私はオリジナルの日付をスライスして(yyyy-mm-dd)フォーマットを取得し、現在の空の配列にその日付が存在するかどうかを調べるために別のforループを作成し、そうでない場合は、任意のゲームをゲームのキーに渡します。最初は私はループを起こし、私の記憶は墜落し、私は前のオブジェクトを上書きし続けました。 – Blake

+0

コメントにコードを投稿するのではなく、質問の編集としてコードを追加します。 –

答えて

2

ここにはreduceを使用した解決策があります。 timeを日付文字列に分割し、各日付のキーを設定します。キーが配列にプッシュ存在する場合:

更新は配列形式のバージョン

const data = [ 
 
    {notes: 'Game was played', time: '2017-10-04T20:24:30+00:00', sport: 'hockey', owner: 'steve', players: '10', game_id: 1}, 
 
    { notes: 'Game was played', time: '2017-10-04T12:35:30+00:00', sport: 'lacrosse', owner: 'steve', players: '6', game_id: 2 }, 
 
    { notes: 'Game was played', time: '2017-10-14T20:32:30+00:00', sport: 'hockey', owner: 'steve', players: '4', game_id: 3 }, 
 
    { notes: 'Game was played', time: '2017-10-04T10:12:30+00:00', sport: 'hockey', owner: 'henry', players: '10', game_id: 4 }, 
 
    { notes: 'Game was played', time: '2017-10-14T20:34:30+00:00', sport: 'soccer', owner: 'john', players: '12', game_id: 5 } 
 
]; 
 

 
// this gives an object with dates as keys 
 
const groups = data.reduce((groups, game) => { 
 
    const date = game.time.split('T')[0]; 
 
    if (!groups[date]) { 
 
    groups[date] = []; 
 
    } 
 
    groups[date].push(game); 
 
    return groups; 
 
}, {}); 
 

 
// Edit: to add it in the array format instead 
 
const groupArrays = Object.keys(groups).map((date) => { 
 
    return { 
 
    date, 
 
    games: groups[date] 
 
    }; 
 
}); 
 

 
console.log(groupArrays);

+0

オースティン、お返事ありがとうございました。私は同様の答えをforループを使って得ることができましたが、私が必要とするのは、日付が独自のキーであり、ゲームが別のキー(同じオブジェクト内のすべて)の値として配列にリストされるためです。 。だから{date: 'date'、games:[...]} – Blake

+0

@Blakeはそれを手に入れました。私が追加したばかりのアップデートは、あなたが探しているものをあなたに与えるはずだと思います。 –

+0

オースティンの助けをありがとう、この問題は私に一日中頭痛を与えてきました! – Blake

0

を追加し、あなたが探しているものがこれです?

var data = [ 
 
    { 
 
     notes: 'Game was played', 
 
     time: '2017-10-04T20:24:30+00:00', 
 
     sport: 'hockey', 
 
     owner: 'steve', 
 
     players: '10', 
 
     game_id: 1 
 
    }, 
 
    { 
 
     notes: 'Game was played', 
 
     time: '2017-10-04T12:35:30+00:00', 
 
     sport: 'lacrosse', 
 
     owner: 'steve', 
 
     players: '6', 
 
     game_id: 2 
 
    }, 
 
    { 
 
     notes: 'Game was played', 
 
     time: '2017-10-14T20:32:30+00:00', 
 
     sport: 'hockey', 
 
     owner: 'steve', 
 
     players: '4', 
 
     game_id: 3 
 
    }, 
 
    { 
 
     notes: 'Game was played', 
 
     time: '2017-10-04T10:12:30+00:00', 
 
     sport: 'hockey', 
 
     owner: 'henry', 
 
     players: '10', 
 
     game_id: 4 
 
    }, 
 
    { 
 
     notes: 'Game was played', 
 
     time: '2017-10-14T20:34:30+00:00', 
 
     sport: 'soccer', 
 
     owner: 'john', 
 
     players: '12', 
 
     game_id: 5 
 
    } 
 
]; 
 

 
function extract() { 
 
    var groups = {}; 
 

 
    data.forEach(function(val) { 
 
     var date = val.time.split('T')[0]; 
 
     if (date in groups) { 
 
      groups[date].push(val.sport); 
 
     } else { 
 
      groups[date] = new Array(val.sport); 
 
     } 
 
    }); 
 

 
    console.log(groups); 
 
    return groups; 
 
} 
 

 
extract();

+0

こんにちはボビー、私に答える時間をとってくれてありがとう。私はすでに同様のフォーマットでそれを取得していました。私が必要としたフォーマット(上記のオースティンが正しく答えたフォーマット)は、[{date: 'date string'、ゲーム:[この日付のゲームの配列]]]でした。 – Blake

+0

ああ、私が見る; Dハッピーコーディング! – bobbyanne

0

let a =[{ 
 
     "notes": "Game was played", 
 
     "time": "2017-10-04T20:24:30+00:00", 
 
     "sport": "hockey", 
 
     "owner": "steve", 
 
     "players": "10", 
 
     "game_id": 1, 
 
     }, 
 
     { 
 
     "notes": "Game was played", 
 
     "time": "2017-10-04T12:35:30+00:00", 
 
     "sport": "lacrosse", 
 
     "owner": "steve", 
 
     "players": "6", 
 
     "game_id": 2, 
 
     }, 
 
     { 
 
     "notes": "Game was played", 
 
     "time": "2017-10-14T20:32:30+00:00", 
 
     "sport": "hockey", 
 
     "owner": "steve", 
 
     "players": "4", 
 
     "game_id": 3, 
 
     }, 
 
     { 
 
     "notes": "Game was played", 
 
     "time": "2017-10-04T10:12:30+00:00", 
 
     "sport": "hockey", 
 
     "owner": "henry", 
 
     "players": "10", 
 
     "game_id": 4, 
 
     }, 
 
     { 
 
     "notes": "Game was played", 
 
     "time": "2017-10-14T20:34:30+00:00", 
 
     "sport": "soccer", 
 
     "owner": "john", 
 
     "players": "12", 
 
     "game_id": 5, 
 
     }] 
 

 
     let finalObj = {} 
 
     a.forEach((games) => { 
 
     const date = games.time.split('T')[0] 
 
     if (finalObj[date]) { 
 
      finalObj[date].push(games); 
 
     } else { 
 
      finalObj[date] = [games]; 
 
     } 
 
     }) 
 
     console.log(finalObj)

関連する問題