2017-10-18 197 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',games:[这个日期的游戏阵列]}]。 – 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)

相关问题