簡體   English   中英

Javascript:使用日期作為數組鍵不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM