Javascript:从另一个数组创建数组
我有一个Firebase的阵列快照,其中包含我的应用程序的条目。在其他信息中,有一个称为“referenceDate”的时间戳: 我想输出按月份和年份分组在标题下的条目,如下所示Javascript:从另一个数组创建数组,javascript,arrays,Javascript,Arrays,我有一个Firebase的阵列快照,其中包含我的应用程序的条目。在其他信息中,有一个称为“referenceDate”的时间戳: 我想输出按月份和年份分组在标题下的条目,如下所示 08.2017 03.08.2017 02.08.2017 01.08.2018 07.2017 03.07.2017 02.07.2017 我的想法是在阵列快照上循环并创建另一个嵌套快照,如下所示: {"monthYear": "08.2017":[ {"referenzDatum": 2017-08-0
08.2017
03.08.2017
02.08.2017
01.08.2018
07.2017
03.07.2017
02.07.2017
我的想法是在阵列快照上循环并创建另一个嵌套快照,如下所示:
{"monthYear": "08.2017":[
{"referenzDatum": 2017-08-03},... },
{"referenzDatum": 2017-08-02},... },
{"referenzDatum": 2017-08-01},... },]},
{"monthYear": "07.2017":[
{"referenzDatum": 2017-07-03},... },
{"referenzDatum": 2017-07-02},... }, ...]}
然后使用两个嵌套的ngFor在其上循环以生成html输出
有没有一个简单的方法来实现这一点?每当发生变化时,我试图根据相应的monthyear将旧条目推送到新数组中,但没有成功,因为引用被复制了。
然后我尝试了下面的代码,但是它在两个多月内都不能正常工作,代码看起来很糟糕
var oldDate: string;
var newDate: string;
sortedLogLine.entries = [];
this.sortedLog = [];
for (var i = 0; i < entries.length; i++) {
newDate = entries[i].referenceDate.substring(0, 7).split('-').reverse().join('.');
if (oldDate == newDate) {
sortedLogLine.entries.push(entries[i]);
}
if (!oldDate) {
sortedLogLine.entries.push(entries[i]);
sortedLogLine.monthYear = newDate;
oldDate = newDate;
}
if (oldDate != newDate) {
pushSortedLogLine.entries = sortedLogLine.entries.slice(0);
pushSortedLogLine.monthYear = oldDate;
this.sortedLog.push(pushSortedLogLine);
sortedLogLine.entries = [];
sortedLogLine.entries.push(entries[i]);
sortedLogLine.monthYear = newDate;
oldDate = newDate;
}
}
this.sortedLog.push(sortedLogLine);
var oldDate:字符串;
var newDate:字符串;
sortedLogLine.entries=[];
this.sortedLog=[];
对于(变量i=0;i
关于如何更有效地做到这一点,有什么建议吗 看一看
我相信Lodash比underline.js更好,更多细节请参见通常的方法是
groupBy
。Javascript在其数组上没有本机groupBy方法,但有几个帮助程序库(如underline.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' } ] }
另请参见。可能使用哈希表:
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"));
}
});
试试这个:
const entries=[{referenceDate:'2017-08-03'},{referenceDate:'2017-08-02'},{referenceDate:'2017-08-01'},{referenceDate:'2017-07-03'},{referenceDate:'2017-07-02'}];
const resultObj={};
对于(变量i=0;i
你试过了吗?
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"));
}
});
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);
});