I have these 2 arrays , one contains the time period, the second one contains the prices for each period.
how can I output the average price for the last 30 days, 60 days, etc…?
time[ '2021-01-14', '2021-02-08', '2021-02-16', '2021-02-16', '2021-02-17', '2021-02-22', '2021-02-26', '2021-02-28', '2021-04-07', '2021-04-25', '2021-04-26', '2021-05-10', '2021-05-11', '2021-05-13', '2021-05-15', '2021-05-16', '2021-05-24', '2021-06-09', '2021-06-14', '2021-06-14', '2021-06-17', '2021-06-19', '2021-06-20', '2021-07-15', '2021-07-17', '2021-07-17', '2021-07-19', '2021-07-19', '2021-08-02' ] prices[ 79999, 69999, 76641, 76506, 79999, 69999, 64999, 69999, 79999, 72500, 69999, 72500, 77449, 77433, 77684, 79999, 69999, 79999, 69999, -1, 69999, -1, 69999, 74999, 69999, 74999, 69999, 74999, 64999 ]
Advertisement
Answer
Here I combine the two arrays using map() and make the time into a Data object. I create a Date object and reduce it by 30 days. I filter the combined array using filter() and calculate the sum of the prices using reduce().
var time = [ '2021-01-14', '2021-02-08', '2021-02-16', '2021-02-16', '2021-02-17', '2021-02-22', '2021-02-26', '2021-02-28', '2021-04-07', '2021-04-25', '2021-04-26', '2021-05-10', '2021-05-11', '2021-05-13', '2021-05-15', '2021-05-16', '2021-05-24', '2021-06-09', '2021-06-14', '2021-06-14', '2021-06-17', '2021-06-19', '2021-06-20', '2021-07-15', '2021-07-17', '2021-07-17', '2021-07-19', '2021-07-19', '2021-08-02' ]; var prices = [ 79999, 69999, 76641, 76506, 79999, 69999, 64999, 69999, 79999, 72500, 69999, 72500, 77449, 77433, 77684, 79999, 69999, 79999, 69999, -1, 69999, -1, 69999, 74999, 69999, 74999, 69999, 74999, 64999 ]; var combined = time.map((d,i) => {return {date: new Date(d), price: prices[i]}}); //var d = new Date(); // for the purpose of this fixed set of date/price this code will have a fixed "now"-date instead of a future date: var d = new Date('2021-08-04'); d.setDate(d.getDate()-30); var filtered = combined.filter(item => item.date.getTime() > d.getTime()); console.log('Should return 6 objects when d = 2021-08-04:', filtered.length); var priceSum = filtered.reduce((accumulator, item) => {return accumulator + item.price}, 0); console.log('Should return 429994:', priceSum);
You can adjust the time range by defining another date object from a fixed date, like:
var d = new Date('2021-08-01'); console.log(d); d.setDate(d.getDate()-60); console.log(d);