Это интересная проблема.Объяснение можно найти в собственной документации :
Примечание: защитная копия объекта шаблона не создается;Модификации возвращенного объекта могут отрицательно повлиять на последующую оценку интерполятора .Никакая копия не сделана по причинам производительности;Интерполяторы часто являются частью внутреннего цикла анимированных переходов.(выделение мое)
Как видите, если вы используете тот же интерполятор, вы получите странный результат, который вы описали (откройте консоль вашего браузера, не используйте фрагмент):
var a = {
"Country": "Ireland",
"Year": 2010,
"Data": 10
};
var b = {
"Country": "Ireland",
"Year": 2015,
"Data": 50
};
var iFunc = d3.interpolateObject(a, b);
var iVals = d3.range(0, 1, 0.2).map(iFunc);
console.log(iVals)
<script src="https://d3js.org/d3.v5.min.js"></script>
Итак, простейшим решением является определение функции интерполяции внутри map()
:
var iVals = d3.range(0, 1, 0.2).map(function(d) {
return d3.interpolateObject(a, b)(d)
});
Вот демонстрационная версия:
var a = {
"Country": "Ireland",
"Year": 2010,
"Data": 10
};
var b = {
"Country": "Ireland",
"Year": 2015,
"Data": 50
};
var iVals = d3.range(0, 1, 0.2).map(function(d) {
return d3.interpolateObject(a, b)(d)
});
console.log(iVals)
<script src="https://d3js.org/d3.v5.min.js"></script>
В качестве альтернативы создайте функцию, которая возвращает интерполятор:
var iFunc = function(d) {
return d3.interpolateObject(a, b)(d)
};
var iVals = d3.range(0, 1, 0.2).map(iFunc);
Вот соответствующая демонстрационная программа:
var a = {
"Country": "Ireland",
"Year": 2010,
"Data": 10
};
var b = {
"Country": "Ireland",
"Year": 2015,
"Data": 50
};
var iFunc = function(d) {
return d3.interpolateObject(a, b)(d)
};
var iVals = d3.range(0, 1, 0.2).map(iFunc);
console.log(iVals)
<script src="https://d3js.org/d3.v5.min.js"></script>
PS: Не относится к вашему вопросу, но значение «стоп» в d3.range()
не включено.Итак, если вы хотите получить значения в объекте b
, оно должно быть:
d3.range(0, 1.2, 0.2)
Вот оно:
var a = {
"Country": "Ireland",
"Year": 2010,
"Data": 10
};
var b = {
"Country": "Ireland",
"Year": 2015,
"Data": 50
};
var iVals = d3.range(0, 1.2, 0.2).map(function(d) {
return d3.interpolateObject(a, b)(d)
});
console.log(iVals)
<script src="https://d3js.org/d3.v5.min.js"></script>