如何在包含日期范围的数组中填充日期?

时间:2014-10-23 00:05:22

标签: javascript momentjs

我有一个包含计数值的日期数组。例如

[
  {
    "date": "2014-11-11T08:00:00.000Z",
    "count": 8
  },
  {
    "date": "2014-11-13T08:00:00.000Z",
    "count": 4
  }
  {
    "date": "2014-11-16T08:00:00.000Z",
    "count": 4
  }
]

如何使用count = 0填写缺少的日期,以在javascript中生成以下内容:

[
  {
    "date": "2014-11-11T08:00:00.000Z",
    "count": 8
  },
  {
    "date": "2014-11-12T08:00:00.000Z",
    "count": 0
  },
  {
    "date": "2014-11-13T08:00:00.000Z",
    "count": 4
  },
  ...
]

3 个答案:

答案 0 :(得分:2)

因为您似乎正在使用momentjs

首先想到的是使用moment().add(number, units)moment().diff(input, units, asFloat)

类似



var data = [
  {
    "date": "2014-11-11T08:00:00.000Z",
    "count": 8
  }, {
    "date": "2014-11-16T08:00:00.000Z",
    "count": 4
  }
];

var startDate = moment(data[0].date);
var endDate = moment(data[1].date);

var days = endDate.diff(startDate, 'd', false);
alert(days);
for (var i = 1; i < days; i++) {
  data.splice(i,0, {"date" : startDate.add(1, 'd').toISOString(), 'count': 0  })
}


for (var i = 0; i < data.length; i++) {
 alert(data[i].date);
}
&#13;
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/moment.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

试试这个:

var arr = [
    {
        "date": "2014-11-11T08:00:00.000Z",
        "count": 8
    },
    {
        "date": "2014-11-16T08:00:00.000Z",
        "count": 4
    }
];

function fillDates(start, end) {
    var output = [start];
    var date = new Date(start.date);
    var endDate = new Date(end.date);

    do {
        output.push({
            "date": date.toISOString(),
            "count": 0
        });
        date = new Date(date.getTime());
        date.setDate(date.getDate() + 1);
    } while (date < endDate);

    output.push(end);
    return output;
}

var start = arr[0];
var end = arr[1];
fillDates(start, end);

答案 2 :(得分:0)

const models = [
    {
        date: '2018-10-17',
        value: 3,
    },
    {
        date: '2018-10-20',
        value: 4,
    },
    {
        date: '2018-10-21',
        value: 5,
    },
    {
        date: '2018-10-27',
        value: 6,
    },
];

const filledInDates = models.reduce((newArray, currentModel, index, originalArray) => {
    const nextModel = originalArray[index + 1];

    if (nextModel) {
        const currentDate = moment(currentModel.date);
        const daysBetween = moment(nextModel.date).diff(currentDate, 'days');

        const fillerDates = Array.from({length: daysBetween - 1}, (value, dayIndex) => {
            return {
                value: currentModel.value,
                date: moment(currentDate).add(dayIndex + 1, 'days').format('YYYY-MM-DD'),
            };
        });

        newArray.push(currentModel, ...fillerDates);
    } else {
        newArray.push(currentModel);
    }

    return newArray;
}, []);

console.log(filledInDates);

输出:

[
    {value:3, date:"2018-10-17"},
    {value:3, date:"2018-10-18"},
    {value:3, date:"2018-10-19"},
    {value:4, date:"2018-10-20"},
    {value:5, date:"2018-10-21"},
    {value:5, date:"2018-10-22"},
    {value:5, date:"2018-10-23"},
    {value:5, date:"2018-10-24"},
    {value:5, date:"2018-10-25"},
    {value:5, date:"2018-10-26"},
    {value:6, date:"2018-10-27"}
]