интерполировать между датами с учетом известного диапазона индекса - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь заполнить некоторые жестко закодированные «данные».Ось X - это время в годах, а ось Y - числовое значение.График будет напоминать экспоненциальную функцию.Вот то, что у меня есть, вы заметите, что диапазон индекса (обозначенный как n) равен 100:

var data = [];
var n = 100;
var a = 1;
var b = 2;

for(var k = 0; k <100; k++) {
    data.push({x: ???, y: a * Math.pow(b, 0.01 * k)});
}

Я не мог понять, как интерполировать даты.Моя первая попытка начиналась с моего начального года и добавляла приращения, а затем переходила на String() на год, но я получился с чем-то, что больше не было датой.Математические операции не знали, что мне нужен вывод даты, поэтому я полагаю, что это моя вина.И мне еще предстоит подумать о лучшем способе.

Вопрос:

Как интерполировать две даты в JavaScript в цикле for?

  • Дата начала: 1800-01-01
  • Дата окончания: 2020-01-01
  • n: 100

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Использование может использовать интервалы с выделенными js датой / временем библиотеки:

https://moment.github.io/luxon/docs/class/src/interval.js~Interval.html

https://momentjs.com/

https://github.com/iamkun/dayjs

или https://www.htmlgoodies.com/html5/javascript/calculating-the-difference-between-two-dates-in-javascript.html

0 голосов
/ 26 августа 2018

Вы можете получить реальные объекты даты, а не просто строки, замаскированные под даты, используя шкалу времени и метод invert.

Чтобы это работало, нам просто нужноустановить переменные ...

var n = 100;
var a = 1;
var b = 2;
var startDate = "1800-01-01";
var endDate = "2020-01-01";

... и парсер:

var parser = d3.timeParse("%Y-%m-%d");

Теперь мы установим масштаб.Важной частью является установка диапазона от 0 до 100.Это диапазон, который мы будем использовать с invert, чтобы получить соответствующую дату:

var scale = d3.scaleTime()
  .domain([parser(startDate), parser(endDate)])
  .range([0, n]);

Наконец, мы создаем массив.Мы можем использовать d3.range и избавиться от цикла for:

var data = d3.range(n).map(function(k) {
  return {
    x: scale.invert(k),
    y: a * Math.pow(b, 0.01 * k)
  }
});

Вот демоверсия:

var n = 100;
var a = 1;
var b = 2;
var startDate = "1800-01-01";
var endDate = "2020-01-01";

var parser = d3.utcParse("%Y-%m-%d");

var scale = d3.scaleTime()
  .domain([parser(startDate), parser(endDate)])
  .range([0, n]);

var data = d3.range(n).map(function(k) {
  return {
    x: scale.invert(k),
    y: a * Math.pow(b, 0.01 * k)
  }
})

console.log(data)
<script src="https://d3js.org/d3.v5.min.js"></script>
0 голосов
/ 26 августа 2018

Поскольку это только год, который увеличивается, не имеет значения, что это дата - просто отформатируйте строку перед тем, как вставить ее в массив

let startYear = 1800;
const endYear = 2020;
const years = [];

for(startYear; startYear <= endYear; startYear++) {
	years.push(`${startYear}-01-01`)    
}

console.log(years)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...