2017-09-28 3 views
0

発生する月に基づいてイベントのリストを表示したいと思います。今JSONとの配列は、各イベントは、オブジェクトとして含まれているが、私はこのようにそれを表示したいので、ここで私がしたいようJavascript JSONからイベントを月に分割する方法

January 
- event blabla 10/01/17 
- event thisandthat 17/01/17 

February 
- event something 05/02/17 
- event another something 13/02/17 

...etc etc 

私はJSONを使用することはできません。では、JSONを私のニーズに「変更」する方法がありますか?

は今のところ、私はこのように私のJSONを受け取る:

[{ 
    "January": [{ 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-01-10" 
     }, 
     { 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-01-17" 
     } 
    ] 
}, 
{ 
    "February": [{ 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-02-10" 
     }, 
     { 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-02-17" 
     } 
    ] 
}, 
{ 
    "March": [{ 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-03-10" 
     }, 
     { 
      "event_name": "blabla", 
      "event_location" : "somewhere", 
      "event_date": "2017-03-17" 
     } 
    ] 
    } 
] 

どのように私はこの(その可能な場合)を達成することができます

[{ 
    "event_name": "blabla", 
    "event_location" : "somewhere", 
    "event_date": "2017-01-10" 
}, 
{ 
    "event_name": "blabla", 
    "event_location" : "somewhere", 
    "event_date": "2017-01-10" 
}, 
{ 
    "event_name": "blabla", 
    "event_location" : "somewhere", 
    "event_date": "2017-02-10" 
}, 
{ 
    "event_name": "blabla", 
    "event_location" : "somewhere", 
    "event_date": "2017-03-20" 
}, 
{ 
    "event_name": "blabla", 
    "event_location" : "somewhere", 
    "event_date": "2017-05-05" 
}] 

私の望ましい結果は、次のようになりますか?

+2

「2017-17-10」有効な日付である、第二のオブジェクトは、*プロパティを使用してアレイに私は右理解していれば – marvel308

+1

だから、あなたがしたいこと*グループオブジェクトを持っています。 googleでこのフォーマットのテキストを検索してください。あなたの解決策が届きます。 – Rajesh

+0

@Steve申し訳ありませんが、上記のコメントが無礼だった場合。しかし、あなたの担当者と一緒にいるユーザーは、分担努力の重要性を知っている必要があります。私たちがここに持っているのは、要件であり、問​​題の声明ではありません。私の前のコメントに加えて、これはあなたを助けます:https://stackoverflow.com/questions/31688459/group-array-items-using-object – Rajesh

答えて

1

Array#reduceを使用すると、これを実現できます。

var data = [{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-01-10" 
 
}, 
 
{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-10-17" 
 
}, 
 
{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-02-10" 
 
}, 
 
{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-03-20" 
 
}, 
 
{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-05-05" 
 
}]; 
 

 
var monthName = ["January", "February", "March", "April", "May", "June", 
 
    "July", "August", "September", "October", "November", "December" 
 
]; 
 
var groups = data.reduce(function(acc, o) { 
 
    var month = monthName[new Date(o.event_date).getMonth()]; 
 
    acc[month] = acc[month] || []; 
 
    acc[month].push(o); 
 
    return acc; 
 
}, {}); 
 

 
var result = Object.keys(groups).sort(function(a, b) { 
 
    return monthName.indexOf(a) - monthName.indexOf(b); 
 
}).map(function(key) { 
 
    var o = {}; 
 
    o[key] = groups[key]; 
 
    return o; 
 
}); 
 

 
console.log(result);

+0

これは素晴らしいことです!どうもありがとう! :-) – Steve

0

あなたはそれらを介してループをすることができ、かつヶ月である新しいオブジェクトにコピーを置く:

let unorganized = [{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-01-10" 
 
}, 
 
{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-01-10" 
 
}, 
 
{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-02-10" 
 
}, 
 
{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-03-20" 
 
}, 
 
{ 
 
    "event_name": "blabla", 
 
    "event_location" : "somewhere", 
 
    "event_date": "2017-05-05" 
 
}]; 
 

 
let organized = {}; 
 
let months = 'January February March April May June July August Septermber October November December'.split(' '); 
 

 
unorganized.forEach(event => { 
 
    let date = new Date(event.event_date); 
 
    let month = date.getMonth(); 
 
    let monthName = months[month] 
 
    if (!(monthName in organized)) { 
 
    organized[monthName] = []; 
 
    } 
 
    
 
    organized[monthName].push(event); 
 
}); 
 

 
console.log(organized);

それとも、lodashを使用して、このような何か行うことができます。

organized = _.groupBy(unorganized, e => months[new Date(e.event_date).getMonth()]) 
関連する問題