2017-08-10 74 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>