Причина этого в том, что числа, с которыми вы имеете дело, на самом деле не числа, а строки. В этом случае он будет использовать max
на основе сравнения строк (который, я думаю, будет основан на порядках сортировки).
То, что вы хотите сделать, - это предварительно записать ваши данные в число. Если вы используете статические данные, просто сделайте следующее:
data = data.map(d => ({ ...d, num_products: +d.num_products });
Я бы рекомендовал делать это на ранних стадиях с исходными данными, так как в противном случае вы можете повторить эту операцию несколько раз, что расточительно.
Если вы запрашиваете данные, вы также можете отформатировать их при входе. Типичный пример ( D3 V5 ) будет выглядеть так:
d3.json("...pathToJson")
.then(data => data.map(d => ({ ...d, num_products: +d.num_products }))
.then((data) => {
// Call you render function
});
Обратите внимание, что вы можете сделать то же самое с предыдущими версиями D3, но они не используют обещания, вместо этого они обычно принимают дополнительный обратный вызов в функцию d3.csv()
, d3.json()
, d3.tsv()
.