2017-02-27 6 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 = {}を変更する必要があります。

.map通常のJavaScriptにオブジェクトはありません。ただし、for (i in games_by_date)でキーをループするか、lodashを使用して_.map(object, callback)を入力します。

関連する問題