2017-08-10 1 views
2

Ich habe einen Array-Snapshot aus Firebase, die die Einträge meiner Anwendung enthält. Neben anderen Informationen gibt es aa Zeitstempel „referenceDate“ genannt:Javascript: Erstellen eines Arrays aus einem anderen

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

ich ausgeben möchte, dass die unter einer Überschrift gruppierten Einträge nach Monat und Jahr wie diese

08.2017 
03.08.2017 
02.08.2017 
01.08.2018 
07.2017 
03.07.2017 
02.07.2017 

Meine Idee ist, eine Schleife über das Array -snapshot und eine weitere verschachtelte erstellen, die wie folgt aussieht: mit zwei ineinander geschachtelten ngFor

{"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},... }, ...]} 

dann die Schleife über den HTML-Ausgabe zu erzeugen.

Gibt es einen einfachen Weg, dies zu erreichen? Ich habe versucht, den alten Eintrag in das neue Array zu verschieben, wenn sich das ändert, aber das hat nicht funktioniert, weil Referenzen kopiert wurden. dann habe ich den folgenden Code versucht, aber es funktioniert nicht mehr als 2 verschiedene Monate und der Code sieht einfach schrecklich aus.

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

Irgendwelche Vorschläge, wie man das effizienter macht?

+0

hast du versucht [Underscore GroupBy] (http://underscorejs.org/#groupBy)? –

Antwort

1

Der üblicher Weg, etwas zu tun, wie dies groupBy wäre. Javascript hat keine native groupBy-Methode für seine Arrays, aber mehrere Hilfsbibliotheken wie underscore.js. Alternativ können Sie Ihre eigene mit reduce rollen:

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) 

, die diese Ausgabe erzeugt:

{ '08.2017': 
    [ { referenceDate: '2017-08-03' }, 
    { referenceDate: '2017-08-02' }, 
    { referenceDate: '2017-08-01' } ], 
    '07.2017': 
    [ { referenceDate: '2017-07-03' }, 
    { referenceDate: '2017-07-02' } ] } 

Siehe auch this similar question.

0

Wahrscheinlich eine Hash-Tabelle verwenden:

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

Dann können Sie alle verfügbaren Jahre erhalten, zu sortieren und sie anzuzeigen:

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

starten:

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>

Verwandte Themen