Относительно вашей проблемы: earliest
и dateMin
указывают на один и тот же объект.Изменение одного изменит другое:
var earliest = new Date();
var dateMin = earliest;
dateMin.setDate(dateMin.getMonth() - 30);
console.log(earliest);
Это, конечно, не имеет ничего общего с D3, это функция JavaScript.Тем не менее, D3 предоставляет метод, который не только проще, но и позволяет избежать таких ошибок.
A D3 надежный способ:
Вы должны использовать interval.offset
, который:
Возвращает новую дату, равную дате плюс интервалы шага.
Например, добавление 30 дней:
const date = new Date();
const datePlus30Days = d3.timeDay.offset(date, 30);
console.log(datePlus30Days)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
В качестве альтернативы, удаление 30 дней:
const date = new Date();
const dateMinus30Days = d3.timeDay.offset(date, -30);
console.log(dateMinus30Days)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
Итак, в вашей шкале используйте:
var dateMin = d3.min(data, function(d){
return d3.timeDay.offset(d.date, -30);
});
var dateMax = d3.max(data, function(d){
return d3.timeDay.offset(d.date, 30);
});