У меня есть массив с объектом (дата и значение), проблема в том, что несколько объектов даты отсутствуют в этом массиве. Я хочу полностью заполнить этот массив каждой датой, основанной на дате начала и дате окончания, также мы должны рассмотреть внутренние даты, поэтому, если дата не существует после одного дня, тогда этот объект дня должен быть добавлен после этого со значением null.

Для этого я создал стек-блиц: https://stackblitz.com/edit/js-pfbcxz В этом коде я добавил разные объекты даты, а также один и тот же объект даты с разным временем. Я написал некоторый код, но он не полностью отвечает моим требованиям. Только несколько объектов вставляются.

0
Swams reggae 12 Апр 2019 в 05:07

2 ответа

Лучший ответ

Другое решение использует moment.js, но то, что я напишу для своего решения, использует чистый Vanilla JavaScript. По сути, мы будем использовать цикл while для циклического перемещения по массиву, а затем проверяем, есть ли какая-либо разница между датой текущего индекса и датой предыдущего индекса. Если есть разница, мы будем добавлять промежуточные даты с нулевым значением на y.

const json_data = [{
x: "2018-06-21T20:30:00Z",
y: 6.39
  },
  {
x: "2018-07-21T10:30:00Z",
y: 6.39
  },
  {
x: "2018-07-21T09:30:00Z",
y: 6.39
  },
  {
x: "2018-08-21T21:30:00Z",
y: 5.93
  },
  {
x: "2018-09-21T21:30:00Z",
y: 5.93
  }
];
const getDates = (startDate, stopDate) => {
  const dateArray = [];
  let counterDate = startDate;
  const stopCounter = new Date(stopDate.setDate(stopDate.getDate() -1));
  while (counterDate < stopCounter) {
dateArray.push(counterDate);
counterDate = new Date(counterDate.setDate(counterDate.getDate() + 1));
  }
  return dateArray;
}
//console.log(getDates(new Date(json_data[0].x),new Date(json_data[1].x)))
let k = 1;
const result = [];
while (k < json_data.length) {
  const inBetween = getDates(new Date(json_data[k - 1].x),new Date(json_data[k].x)).map(date => ({
x: date.toISOString(),
y: null
  }));
  //console.log(inBetween)
  if (inBetween.length > 0) {
result.push(json_data[k-1], ...inBetween)
  }
  if (k === json_data.length - 1) {
result.push(json_data[k]);
  }
  k++;
}
console.log(result)
1
wentjun 12 Апр 2019 в 05:35

Попробуйте преобразовать список объектов в простой объект

А затем найдите ключ (дату) в объекте.

Если не найдено, создайте ключ с нулем

var json_data = [
{x: "2018-06-21T20:30:00.000Z", y: 6.39},
{x: "2018-07-21T10:30:00.000Z", y: 6.39},
{x: "2018-07-21T09:30:00.000Z", y: 6.39},
{x: "2018-08-21T21:30:00.000Z", y: 5.93},
{x: "2018-09-21T21:30:00.000Z", y: 5.93}
];
var obj = json_data.reduce((acc, data) => {
    acc[data.x] = data.y;
    return acc;
}, {});
var firstDate = new Date(json_data[0].x);
var secondDate = new Date(json_data[json_data.length-1].x);
var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds
var diffDays = Math.round(Math.abs((firstDate.getTime() - 
secondDate.getTime())/(oneDay)));
let k=0;
while(k < diffDays) {
    let nextDay = new Date(new Date(firstDate).getTime() + (k * oneDay));  
    if(obj[nextDay] === undefined) {
      obj[nextDay.toISOString()] = null
    }
    k++      
}
var res = Object.entries(obj).map(item => ({
    x: item[0],
    y: item[1],
}));
console.log(res);

Вы можете использовать библиотеку moment.js для любых операций с датами.

Добавьте дни к дате

Проверьте дату такой же или перед другой датой

Вот решение с использованием момента.js

var json_data = [
{ x: "2018-06-21T20:30:00Z", y: 6.39 },
{ x: "2018-07-21T10:30:00Z", y: 6.39 },
{ x: "2018-07-21T09:30:00Z", y: 6.39 },
{ x: "2018-08-21T21:30:00Z", y: 5.93 },
{ x: "2018-09-21T21:30:00Z", y: 5.93 }
];
var obj = json_data.reduce((acc, data) => {
   acc[data.x] = data.y;
   return acc;
}, {});
var start = moment("2018-06-21T20:30:00Z");
var end = moment("2018-09-21T21:30:00Z");
while (start.isSameOrBefore(end)) {
   if (obj[start] === undefined) {
      obj[start] = null;
   }
   start = start.add(1, "days");
}
var res = Object.entries(obj).map(item => ({
   x: item[0],
   y: item[1],
}));
console.log(JSON.stringify(res))
1
Shantiswarup Tunga 12 Апр 2019 в 03:46