Javascript 如何按日期对数组中的项目进行分组?

Javascript 如何按日期对数组中的项目进行分组?,javascript,arrays,for-loop,iteration,grouping,Javascript,Arrays,For Loop,Iteration,Grouping,给定以下对象数组: [ { "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": "st

给定以下对象数组:

[
{
"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]);
        }
设t=this.state.data;(以上数据)
让列表=[];
for(设i=0;i
我的版本返回一个以日期为值的数组,然后在这些数组中列出游戏,但我试图将它们作为不同的键列在同一个对象中


任何帮助或指导都将不胜感激。

这里有一个使用
reduce
的解决方案。将时间拆分为日期字符串,然后为每个日期设置一个键。如果密钥存在,请将其推到阵列上:

更新添加了数组格式版本

const数据=[
{注:'比赛进行了',时间:'2017-10-04T20:24:30+00:00',体育:'曲棍球',所有者:'steve',球员:'10',比赛id:1},
{注:'比赛进行了',时间:'2017-10-04T12:35:30+00:00',体育:'lacrosse',所有者:'steve',球员:'6',比赛id:2},
{注:'比赛进行了',时间:'2017-10-14T20:32:30+00:00',体育:'曲棍球',所有者:'steve',球员:'4',比赛id:3},
{注:'比赛进行了',时间:'2017-10-04T10:12:30+00:00',体育:'曲棍球',所有者:'henry',球员:'10',比赛id:4},
{注:'比赛进行了',时间:'2017-10-14T20:34:30+00:00',体育:'soccer',所有者:'john',球员:'12',比赛编号:5}
];
//这将提供一个以日期为键的对象
常量组=数据。减少((组,游戏)=>{
const date=game.time.split('T')[0];
如果(!组[日期]){
组[日期]=[];
}
分组[日期]。推送(游戏);
返回组;
}, {});
//编辑:改为以数组格式添加
const grouparray=Object.keys(groups.map)(日期)=>{
返回{
日期,
游戏:分组[日期]
};
});

log(groupArrays)这就是你要找的吗???
var数据=[
{
注:“游戏已经开始了”,
时间:“2017-10-04T20:24:30+00:00”,
运动:“曲棍球”,
店主:“史蒂夫”,
球员:“10”,
游戏编号:1
},
{
注:“游戏已经开始了”,
时间:“2017-10-04T12:35:30+00:00”,
运动:“长曲棍球”,
店主:“史蒂夫”,
球员:“6”,
游戏编号:2
},
{
注:“游戏已经开始了”,
时间:“2017-10-14T20:32:30+00:00”,
运动:“曲棍球”,
店主:“史蒂夫”,
球员:“4”,
游戏编号:3
},
{
注:“游戏已经开始了”,
时间:“2017-10-04T10:12:30+00:00”,
运动:“曲棍球”,
店主:“亨利”,
球员:“10”,
游戏id:4
},
{
注:“游戏已经开始了”,
时间:“2017-10-14T20:34:30+00:00”,
体育:"足球",,
店主:“约翰”,
球员:"12",,
游戏编号:5
}
];
函数提取(){
变量组={};
data.forEach(函数(val){
var date=val.time.split('T')[0];
如果(分组日期){
组[日期]。推送(val.sport);
}否则{
组[日期]=新数组(val.sport);
}
});
控制台日志(组);
返回组;
}
提取()
=[{
“注意事项”:“游戏已开始”,
“时间”:“2017-10-04T20:24:30+00:00”,
“运动”:“曲棍球”,
“所有者”:“史蒂夫”,
“玩家”:“10”,
“游戏id”:1,
},
{
“注意事项”:“游戏已开始”,
“时间”:“2017-10-04T12:35:30+00:00”,
“运动”:“长曲棍球”,
“所有者”:“史蒂夫”,
“玩家”:“6”,
“游戏id”:2,
},
{
“注意事项”:“游戏已开始”,
“时间”:“2017-10-14T20:32:30+00:00”,
“运动”:“曲棍球”,
“所有者”:“史蒂夫”,
“玩家”:“4”,
“游戏id”:3,
},
{
“注意事项”:“游戏已开始”,
“时间”:“2017-10-04T10:12:30+00:00”,
“运动”:“曲棍球”,
“所有者”:“亨利”,
“玩家”:“10”,
“游戏id”:4,
},
{
“注意事项”:“游戏已开始”,
“时间”:“2017-10-14T20:34:30+00:00”,
“运动”:“足球”,
“所有者”:“约翰”,
“玩家”:“12”,
“游戏id”:5,
}]
设finalObj={}
a、 forEach((游戏)=>{
const date=games.time.split('T')[0]
如果(finalObj[日期]){
finalObj[日期].推送(游戏);
}否则{
finalObj[日期]=[游戏];
}
})
console.log(finalObj)
使用RxJS, 在我的例子中,使用

import { of } from "rxjs";
import { groupBy, map, mergeMap, reduce, toArray } from "rxjs/internal/operators";

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,
  }
];

of(...data).pipe(
  groupBy((p: any) => p.time.split('T')[0]),
  mergeMap(group$ =>
    group$.pipe(reduce((acc, cur) => [...acc, cur], [`${group$.key}`]))
  ),
  map(arr => ({ date: arr[0], games: arr.slice(1) })),
  toArray()
).subscribe(p => console.log(p));
结果:


到目前为止,您尝试了什么?这里的解决方案非常简单。嗨,Spencer,我不知道如何在注释中发布代码,但我创建了一个空数组,并运行了一个for循环来迭代第一个信息。我对原始日期进行切片以获取格式(yyyy-mm-dd),然后创建另一个for循环以检查当前空数组中是否存在该日期,如果不存在,我将为该日期创建一个新密钥,然后将任何游戏传入游戏密钥。起初,我得到了一个infinte循环,我的内存崩溃,然后我一直覆盖我以前的对象。你不想在注释中发布你的代码,而是将其添加为问题的编辑。你的意思是你想将密钥设置为日期,不包括时间吗?所以会有
2017-10-14
2017-10-04
作为关键?嗨,斯宾塞,我更新了我的帖子来展示我所做的。。。我得到了一个与发布的另一个答案类似的结果,但我正在尝试做的是,得到一个数组,每个日期都有一个对象,它有自己的键,还有一个游戏的键。所以[{date:'datestring',games:[array of games]}]嗨,奥斯汀,谢谢你的回答。我可以使用for循环得到类似的答案,但我需要的是d