2016-05-01 46 views
-2

我有一個簡單的JSON列表像一個下面的Javascript:組通過與聚集

{ 
"myList": [ 
    { 

     "endOfPeriod": 1461362400000, 
     "rate": 0.03726378 
    }, 
    { 
     "endOfPeriod": 1461535200000, 
     "rate": 0.03726378 
    }, 
    { 
     "endOfPeriod": 1461967200000, 
     "rate": 0.03708314 
    }, 
    { 
     "endOfPeriod": 1461708000000, 
     "rate": 0.03492851 
    }, 
    { 
     "endOfPeriod": 1461794400000, 
     "rate": 0.03845068 
    }, 
    { 
     "endOfPeriod": 1461621600000, 
     "rate": 0.03544827 
    } 
] 

}

endOfPeriod是Unix紀元時間戳。示例中的所有時間戳均屬於同一個月(2016年4月),但可能還有其他時間段。 假設我已經將這個json列表轉換爲一個數組,並且每個unix時間戳記到一個DD.MM.YYYY日期(我也可以將它們保留在unix時間戳中)。有沒有一種有效的方法來創建一個按月份/年分組的最新速率的新陣列?

我必須用Javascript編寫代碼。

例如:

20.04.2016/0.33 
21.04.2016/0.55 
14.04.2016/0.88 
02.05.2016/1.33 
01.05.2016/5.44 

新數組必須包含:

21.04.2016/0.55 
02.05.2016/1.33 

感謝您的幫助。

+0

請添加一些您喜歡的實例。 –

+0

@NinaScholz:期望的結果的例子是在我的消息結尾:) – matan

+1

其實不清楚你有什麼和你喜歡得到什麼。順便說一句,沒有任何代碼的嘗試,你試過。 –

回答

1

如果我理解正確,您想提取每個月的最新費率。我會用lodash

_.chain(arr) 
    .groupBy(function(item) { 
    var date = new Date(item.endOfPeriod); 
    return date.getFullYear() + '-' + date.getMonth(); 
    }) 
    .map(function(group) { 
    return _.maxBy(group, function(item) { 
     return item.endOfPeriod; 
    }); 
    }) 
    .value() 

我們先從形式對象的列表:

{ 
    "endOfPeriod" : 1464818400000, 
    "rate" : 0.05 
} 

chain()功能包裝列表爲lodash對象。

然後,我們按年份和月份對元素進行分組。的groupBy()之後,我們具有下面的結構(注意得到月()是基於0在Javascript,因此爲3的值對應於四月,等等):

{ 
    "2016-3" : [array of objects in April 2016], 
    "2016-4" : [array of objects in May 2016] 
    ... 
} 

然後,對於每個組,我們取最大的項目endOfPeriod

最後,value()將lodash對象解開爲一個純JavaScript數組。

0

這裏是沒有使用lodash的結果。但對我來說,最好不要重新發明輪子。

const myList = [ 
    { 
    "endOfPeriod": 1461362400000, 
    "rate": 0.03726378 
    }, 
    { 
    "endOfPeriod": 1461535200000, 
    "rate": 0.03726378 
    }, 
    { 
    "endOfPeriod": 1461967200000, 
    "rate": 0.03708314 
    }, 
    { 
    "endOfPeriod": 1461708000000, 
    "rate": 0.03492851 
    }, 
    { 
    "endOfPeriod": 1461794400000, 
    "rate": 0.03845068 
    }, 
    { 
    "endOfPeriod": 1461621600000, 
    "rate": 0.03544827 
    } 
]; 

const res = myList.reduce((prev, current) => { 
    const date = new Date(current.endOfPeriod); 
    const month = date.getMonth(); 
    const year = date.getFullYear(); 

    const key = `${year}-${month}`; 

    if (prev[key] && prev[key].endOfPeriod < current.endOfPeriod) { 
    prev[key] = current; 
    } else { 
    prev[key] = current; 
    } 

    return prev; 
}, {}); 


const finalResult = Object.keys(res).map((key) => { 
    return { 
    key: res[key].rate 
    } 
}); 

console.log(finalResult);