2017-02-27 38 views
0

我有一个包含日期的简单对象列表,我需要按日期对它们进行分组。 不幸的是,它似乎并没有工作。Javascript:使用日期作为数组键不起作用

这里被简化代码:

games = [ 
    {date:"3/5/17", name:"game 1, 3"}, 
    {date:"3/5/17", name:"game 2, 3"}, 
    {date:"4/5/17", name:"game 3, 4"}, 
    {date:"4/5/17", name:"game 4, 4"}, 
    {date:"4/5/17", name:"game 5, 4"}, 
    {date:"5/5/17", name:"game 6, 5"}, 
    {date:"5/5/17", name:"game 7, 5"}, 
] 

let games_by_date = [] 

games.map((i)=>{ 
    if(!games_by_date[i['date']]) 
    games_by_date[i['date']]=[]; 
    games_by_date[i['date']].push(i); 
}) 

console.log(games_by_date)  // shows [3/5/17: Array[2], 4/5/17: Array[3], 5/5/17: Array[2]], but shows it as Array[0] 
console.log(games_by_date[0]) // undefined 
console.log(games_by_date[1]) // undefined 

games_by_date.map((g)=>console.log(g)) // doesn't even gets there 

如果我做相同的,但使用不同的列,它的正常工作。

games = [ 
 
\t {date:"3/5/17", day:"3", name:"game 1, 3"}, 
 
\t {date:"3/5/17", day:"3", name:"game 2, 3"}, 
 
\t {date:"4/5/17", day:"4", name:"game 3, 4"}, 
 
\t {date:"4/5/17", day:"4", name:"game 4, 4"}, 
 
\t {date:"4/5/17", day:"4", name:"game 5, 4"}, 
 
\t {date:"5/5/17", day:"5", name:"game 6, 5"}, 
 
\t {date:"5/5/17", day:"5", name:"game 7, 5"}, 
 
] 
 

 
let games_by_date = [] 
 

 
games.map((i)=>{ 
 
\t if(!games_by_date[i['date']]) 
 
    \t games_by_date[i['date']]=[]; 
 
    games_by_date[i['date']].push(i); 
 
}) 
 

 
console.log(games_by_date) 
 
console.log(games_by_date[0]) 
 
console.log(games_by_date[1]) 
 

 
games_by_date.map((g, d)=>console.log(d, g)) 
 

 
console.log("--------------------") 
 

 
let games_by_day = [] 
 

 
games.map((i)=>{ 
 
\t if(!games_by_day[i['day']]) 
 
    \t games_by_day[i['day']]=[]; 
 
    games_by_day[i['day']].push(i); 
 
}) 
 

 
console.log(games_by_day) 
 
console.log(games_by_day[0]) 
 
console.log(games_by_day[1]) 
 

 
games_by_day.map((g, d)=>console.log(d, g))

如此看来,因为我使用的密钥类型的发生。

你有没有遇到过它,你是如何解决它的? 感谢

回答

3

你可以用减少组由密钥:

let games = [ 
 
    {date:"3/5/17", name:"game 1, 3"}, 
 
    {date:"3/5/17", name:"game 2, 3"}, 
 
    {date:"4/5/17", name:"game 3, 4"}, 
 
    {date:"4/5/17", name:"game 4, 4"}, 
 
    {date:"4/5/17", name:"game 5, 4"}, 
 
    {date:"5/5/17", name:"game 6, 5"}, 
 
    {date:"5/5/17", name:"game 7, 5"}, 
 
]; 
 

 
let games_by_date = games.reduce((a,b) => { 
 
    a[b.date] = a[b.date] ? a[b.date].concat(b) : [b]; 
 
    return a; 
 
}, {}); 
 

 
console.log(games_by_date);

由于“日期”仅仅是字符串,不应该有一个问题他们。

由于@Liam指出正确,这将创建一个对象而不是一个数组,对此的完整解释请参见​​。

+0

请注意,他必须将他的'games_by_date'更改为一个对象而不是数组,这是一个可靠的答案。 (为了清晰起见,您还可以将'res'重命名为'games_by_date') –

+1

指出并链接到您的答案以供@LiamGray进一步解释。 – baao

+1

感谢队友,'.reduce'的+1,因为它是OP想干的代码风格! –

2

您的games_by_date数组应该是一个能够按日期按键的对象。 day键将自动转换为整数,因为它们是整数形式,因此可以用作数组中的键。但是,要使用日期字符串,您必须更改var games_by_date = {}并且它应该工作。

请注意,您不能在常规JavaScript中使用.map对象。但是,您可以使用for (i in games_by_date)环路键或使用lodash来提供_.map(object, callback)