generar fechas y agregar nueva propiedad a la matriz de objeto

No tengo control sobre una lista de datos, pero necesito asignarlos a datos de rango de fechas.

La lista de datos tiene este aspecto, que solo tiene desde y hacia.

[ { "date_from": "2017-05-06 00:00:00", "date_to": "2017-05-08 23:59:59", "state": { "name": "San francisco" } } { "date_from": "2017-05-03 00:00:00", "date_to": "2017-05-07 23:59:59", "state": { "name": "Las Vegas" } } ] 

Soy capaz de generar un rango de fechas en el mes

 function generateDates(startDate, stopDate) { var dateArray = []; var currentDate = moment(startDate); var stopDate = moment(stopDate); while (currentDate <= stopDate) { dateArray.push({ date: moment(currentDate).format('YYYY-MM-DD') }); currentDate = moment(currentDate).add(1, 'days'); } return dateArray; } generateDates('2017-05-01', '2017-05-31'); 

¿Cómo puedo colocar el objeto de estado en la matriz de rango de fechas como

 [ {date: '2017-05-06', state:{name:'San francisco'}}, {date: '2017-05-07', state:{name:'San francisco'}}, {date: '2017-05-08', state:{name:'San francisco'}}, .. .. ] 

 var sparse=input.reduce((sparse,event)=>generateDates(event.date_from,event.date_to).forEach(date=>(sparse[date]=sparse[date]||[]).push(event))||sparse,{}); var result=[]; for(date in sparse){ result.push({date:date,states:sparse[date].map(el=>el.state)}); } 

http://jsbin.com/larumiyeli/edit?console

O si no quieres agrupar:

  var result=input.reduce((sparse,event)=>sparse.concat(generateDates(event.date_from,event.date_to).map(el=>(el.state=event.state,el)),[]); 

http://jsbin.com/mixorecoyo/edit?console

Para una explicación, vea otra respuesta … Parece que hay una clase aquí, ¿no? 😉