2017-08-10 77 views
2

我有一个阵列快照超出Firebase,其中包含我的应用程序的条目。在其他信息有AA时间戳称为“referenceDate”:Javascript:创建另一个阵列

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,... 

我要输出的月和年这样

08.2017 
03.08.2017 
02.08.2017 
01.08.2018 
07.2017 
03.07.2017 
02.07.2017 

我的想法标题下分组的条目是循环阵列上方-snapshot并创建另一个嵌套,如下所示:

{"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将旧的条目推入新的数组中,只要此更改,但没有解决,因为引用被复制。 然后我尝试了下面的代码,但它不会超过2个不同的月份,代码看起来很糟糕。

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); 

有关如何更有效地做到这一点的任何建议?

+0

是否尝试过[Underscore GroupBy](http://underscorejs.org/#groupBy)? –

回答

1

通常的方法做这样的事情,这将是groupBy。 Javascript在其数组中没有本地的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' } ] } 

又见this similar question

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")); 
    } 
}); 
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); 
}); 
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]) { 
 
    \t resultObj[month] = []; 
 
    } 
 
    resultObj[month].push(entries[i]); 
 
} 
 

 
const out = document.getElementsByClassName('json')[0]; 
 
out.innerHTML = JSON.stringify(resultObj, undefined, 2);
<pre class="json"></pre>