[英]Javascript: using date as array key doesn't work
我有一個包含日期的簡單對象的列表,我需要按日期對它們進行分組。 不幸的是,它似乎不起作用。
這是簡化的代碼:
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 = [ {date:"3/5/17", day:"3", name:"game 1, 3"}, {date:"3/5/17", day:"3", name:"game 2, 3"}, {date:"4/5/17", day:"4", name:"game 3, 4"}, {date:"4/5/17", day:"4", name:"game 4, 4"}, {date:"4/5/17", day:"4", name:"game 5, 4"}, {date:"5/5/17", day:"5", name:"game 6, 5"}, {date:"5/5/17", day:"5", 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) 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)=>{ if(!games_by_day[i['day']]) 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) )
似乎是因為我使用的鍵的類型而發生。
您是否遇到過,如何解決? 謝謝
您可以使用reduce來按鍵分組:
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正確指出的那樣,這將創建一個對象而不是一個數組,有關完整說明,請參見@Liam的答案 。
您的games_by_date
數組應該是一個能夠按日期鍵入密鑰的對象。 由於day
鍵采用整數形式,因此會自動轉換為整數,因此可以用作數組中的鍵。 但是,要使用日期字符串,必須更改var games_by_date = {}
,它應該可以工作。
請注意,您無法在常規JavaScript中.map
對象。 但是,您可以使用for (i in games_by_date)
鍵,或使用lodash
提供_.map(object, callback)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.