2017-05-16 54 views
0

我打了一個REST API,它提供了一組數據中包含的數據。日期是字符串。年份組數組

以下是數據的樣子:

arr = [ 
    "2015-07-31", 
    "2015-08-31", 
    "2015-09-30", 
    "2015-10-31", 
    "2015-11-30", 
    "2015-12-31", 
    "2016-01-31", 
    "2016-02-29", 
    "2016-03-31", 
    "2016-04-30", 
    "2016-05-31", 
    "2016-06-30", 
    // MORE ITEMS... 
] 

我將如何實現在今年這個分組陣列(例如2015年:七月,八月,九月等。2016年一月,二月,三月等) 。

自定義管道是否有幫助?在控制器而不是服務中進行分組更好嗎?

+0

你期待什麼樣的結局?一個數組數組?,一個對象,比如'{「2015」:[..],「2016」:[...]}'? –

+0

類似{'2015':[],「2016」:[]} etc – greatTeacherOnizuka

回答

3

在我看來,最好直接在服務中做。 所以在你的服務,你可以有一個私有方法toGroupedYears(arrayOfDates),然後你可以在rxjs操作映射到做這樣的事情:

//myservice.ts 
 
import 'rxjs/add/operator/map' 
 
... 
 
public getDates(){ 
 
    this.http.get(`${this.url}/dates`) 
 
    .map((dates) => this.toGroupedDates(dates.json())) 
 
} 
 
...

而在toGroupedDates方法,你可以有這樣的事情這樣的:

private toGroupedDates(array){ 
 
    // Extract year from arr 
 
    let extractedYear = array.map((date) => { 
 
    return date.split('-')[0]; 
 
    }); 
 

 
    // Get just the year list 
 
    let yearsArray = new Set(extractedYear); 
 

 

 
    // Group by year 
 
    let filteredByYears = []; 
 
    yearsArray.forEach((year) => { 
 
    filteredByYears.push({ [year] : array.filter((_year) => { 
 
     return _year.split('-')[0] == year; 
 
    })}); 
 
    }); 
 
    
 
    return filteredByYears; 
 
}

希望它能幫助你:)

+0

arr.filter據說來自哪裏? arr似乎沒有被定義在任何地方 – greatTeacherOnizuka

+0

這看起來不錯,但現在我得到了一年:[...]。我怎麼能提取一年呢(所以我最終在2016年:[...],2015年:[...]等) – greatTeacherOnizuka

+0

是的,這只是一個簡單的例子,你如何能做到這一點。你想要什麼輸出? – runit

0

我寫一個例子給你 希望它可以幫助你

yearsGroup: any = {}; 
    groupByYear(arry: Array<string>) { 
    arry.forEach((value) => { 
     let date = new Date(value); 
     let year = date.getFullYear(); 
     if (this.yearsGroup[year]) { 
     this.yearsGroup[year].push(value); 
     } else { 
     this.yearsGroup[year] = []; 
     this.yearsGroup[year].push(value); 
     } 
    }); 

    } 

結果:

{ 
    2015:[...], 
    2016:[...] 
}