Вы можете получить реальные объекты даты, а не просто строки, замаскированные под даты, используя шкалу времени и метод 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>