我有一个Firebase的数组快照,其中包含我的应用程序的条目。在其他信息中有一个名为“referenceDate”的时间戳:
pwd
cd /
pwd
我想按月份和年份输出按标题分组的条目
/
我的想法是遍历数组快照并创建另一个嵌套的,如下所示:
entry [0] { referenceDate: 2017-08-03,...
entry [1] { referenceDate: 2017-08-02,...
entry [2] { referenceDate: 2017-08-01,...
entry [3] { referenceDate: 2017-07-03,...
entry [4] { referenceDate: 2017-07-02,...
然后使用两个嵌套的ngFor循环遍历它以生成html输出。
有没有简单的方法来实现这一目标?我尝试只是根据相应的月份将旧条目推送到新数组中,只要这个更改,但是没有成功,因为引用被复制了。 然后我尝试了下面的代码,但它实际上并没有超过2个不同的月份,代码看起来很糟糕。
08.2017
03.08.2017
02.08.2017
01.08.2018
07.2017
03.07.2017
02.07.2017
有关如何更有效地执行此操作的任何建议?
答案 0 :(得分:1)
执行此类操作的常用方法是groupBy
。 Javascript在其Arrays上没有本机groupBy方法,但是像underscore.js这样的几个帮助库。或者,您可以使用reduce
:
let getMonthYear = (obj) => obj.referenceDate.split('-').reverse().slice(1).join('.');
let groupBy = (ary, fn) => ary.reduce(function(groups, item) {
let key = fn(item)
if (!groups[key]) groups[key]=[]
groups[key].push(item)
return groups;
}, {});
let entries = [ { referenceDate: '2017-08-03' },
{ referenceDate: '2017-08-02' },
{ referenceDate: '2017-08-01' },
{ referenceDate: '2017-07-03' },
{ referenceDate: '2017-07-02' } ]
let groups = groupBy(entries, getMonthYear);
console.log(groups)
产生这个输出:
{ '08.2017':
[ { referenceDate: '2017-08-03' },
{ referenceDate: '2017-08-02' },
{ referenceDate: '2017-08-01' } ],
'07.2017':
[ { referenceDate: '2017-07-03' },
{ referenceDate: '2017-07-02' } ] }
答案 1 :(得分:1)
var arrayOfDates = [
{'referenceDate':'2017-08-03'},
{'referenceDate':'2017-08-02'},
{'referenceDate':'2017-08-01'},
{'referenceDate':'2017-07-03'},
{'referenceDate':'2017-07-02'}
];
var result = [];
arrayOfDates.forEach(function(entry) {
var date = new Date(entry.referenceDate);
var day = date.getDate();
var monthIndex = date.getMonth() +1;
var year = date.getFullYear();
var keyDateFormat = monthIndex+'.'+year;
if(!(keyDateFormat in result)) {
result[keyDateFormat] = [];
}
result[keyDateFormat].push(entry);
});
答案 2 :(得分:0)
查看Lodash, specifically groupBy
我相信Lodash是比Underscore.js更好的选择,更多细节见this blog post
答案 3 :(得分:0)
可能使用哈希表:
var timetable = {};
data.forEach(function(el){
var d = new Date(el.referenceDate),
y = d.getFullYear(),
m = d.getMonths() +1;
if(!timetable[y]) timetable[y] = [];
if(!timetable[y][m]) timetable[y][m] = [];
timetable[y][m].push(el);
});
然后,您可以获得所有可用年份,排序并显示它们:
Object.values(timetable).sort((a,b)=>a-b).forEach(function(year){
console.log(year);
for(var [month,entries] of timetable[year].entries()){
console.log(month,entries.join("\n"));
}
});
答案 4 :(得分:0)
试试这个:
const entries = [{ referenceDate: '2017-08-03'}, { referenceDate: '2017-08-02'}, { referenceDate: '2017-08-01'}, { referenceDate: '2017-07-03'}, { referenceDate: '2017-07-02'}];
const resultObj = {};
for (var i = 0; i < entries.length; i++) {
const month = entries[i].referenceDate.substring(0, 7).split('-').reverse().join('.');
if (!resultObj[month]) {
resultObj[month] = [];
}
resultObj[month].push(entries[i]);
}
const out = document.getElementsByClassName('json')[0];
out.innerHTML = JSON.stringify(resultObj, undefined, 2);
&#13;
<pre class="json"></pre>
&#13;